问题描述
我有一个独立的Git存储库,我想将其迁移到新的SVN存储库。至少,我想迁移具有完整历史记录的master分支,但理想情况下,我想迁移所有分支和标签。我只需要进行一次迁移;我不需要重复此过程或进行任何双向同步或类似的操作。
根据我在网上可以找到的信息,最好的工具似乎是git-svn。我觉得我似乎遗漏了一些明显的东西,git svn init
或git svn dcommit
需要传递一些参数,这会使所有这些工作正常,但我找不到它。 / p>
到目前为止,这是我所做的尝试:
尝试1:将git svn提交到空白svn存储库。
[dyaw@localhost v1]$ mkdir svngit ; cd svngit
[dyaw@localhost svngit]$ git svn init svn://server/emptyRepo --stdlayout
Initialized empty Git repository in /home/dyaw/stackoverflow/v1/svngit/.git/
[dyaw@localhost svngit]$ git svn fetch
[dyaw@localhost svngit]$ git config receive.denyCurrentBranch ignore
[dyaw@localhost svngit]$ cd ..
[dyaw@localhost v1]$ git clone /mnt/sharedDrive/sharedRepo/ plaingit
Cloning into 'plaingit'...
done.
[dyaw@localhost v1]$ cd plaingit/
[dyaw@localhost plaingit]$ git remote add svntest /home/dyaw/stackoverflow/v1/svngit
[dyaw@localhost plaingit]$ git branch -a | grep remotes/origin | grep -v -- '->' | cut -d/ -f3 | xargs -L1 git checkout
Branch 'Foo' set up to track remote branch 'Foo' from 'origin'.
Switched to a new branch 'Foo'
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
[dyaw@localhost plaingit]$ git push svntest --all
Enumerating objects: 2719,done.
Counting objects: 100% (2719/2719),done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2591/2591),done.
Writing objects: 100% (2719/2719),4.67 MiB | 18.55 MiB/s,done.
Total 2719 (delta 2011),reused 237 (delta 123)
remote: Resolving deltas: 100% (2011/2011),done.
To /home/dyaw/stackoverflow/v1/svngit
* [new branch] Foo -> Foo
* [new branch] master -> master
[dyaw@localhost plaingit]$ git push svntest --tags
Enumerating objects: 8,done.
Counting objects: 100% (8/8),done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8),done.
Writing objects: 100% (8/8),1.32 KiB | 1.32 MiB/s,done.
Total 8 (delta 0),reused 0 (delta 0)
To /home/dyaw/stackoverflow/v1/svngit
* [new tag] Many tags pushed
[dyaw@localhost plaingit]$ cd ../svngit/
[dyaw@localhost svngit]$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: Every single file in the repository
[dyaw@localhost svngit]$ git reset --hard
HEAD is now at 3161afd
[dyaw@localhost svngit]$ git status
On branch master
nothing to commit,working tree clean
[dyaw@localhost svngit]$ git svn dcommit
Unable to determine upstream SVN information from HEAD history.
Perhaps the repository is empty. at /usr/libexec/git-core/git-svn line 872.
- “也许存储库为空。”是的,肯定是空的。到此为止,我目前在SVN中的内容为零,我需要将所有工作移到那里。
- 这是一个完全空的SVN存储库。甚至没有trunk / tags / branches目录。
尝试#2:git svn提交到具有基本结构(主干/标签/分支)的仓库。
- 基本结果相同。
- 新创建的svngit工作副本中
git svn fetch
的输出为:[dyaw@localhost svngit]$ git svn fetch r1 = 81aad897c91af332c969ece7655a86f8f670bfec (refs/remotes/origin/trunk) Checked out HEAD: svn://server/basicRepo/trunk r1
- 第一个
git push svntest --all
失败,并显示“更新被拒绝,因为远程包含您在本地没有的工作。这通常是由另一个存储库推送到相同的引用引起的。您可能要先集成远程更改(例如“ git pull ...”),然后再次按下。”。完成git pull svntest master --allow-unrelated-histories
并提交合并后,推送成功。 - 最后,
git svn dcommit
给出了关于空存储库的相同错误。
尝试#3:使用GitHub的SVN桥
- 可以通过SVN访问GitHub上的Git存储库。
- 我将Git存储库推送到了GitHub,并且能够从SVN访问它。 (
svn co https://github.com....
) - 通常,
svnrdump
能够转储给定URL的SVN存储库(与svnadmin dump
相对,后者需要作为本地文件系统中的文件提供给存储库),但是svnrdump返回{{ 1}} - 我可以
svnrdump: E200007: The requested report is unknown.
进行一个修订。任何修订似乎都可以使用,但是指定svnrdump dump -r
或修订范围(--incremental
或所有默认设置)会导致报告该错误。 - 显然,GitHub的SVN通过HTTPS实现不包括对增量转储的支持。
- 我可以通过HEAD进行1的非增量转储,但是我不知道有什么方法可以将这些连续的非增量转储转回增量,以使其具有完整的历史记录。
尝试#4:在SVN中进行初始提交,然后从那里进行提交
根据Jeff Mercado的answer。
在执行所有git svn之前,我在SVN的主干中创建了一个空文件。我第一次使用dcommit链接到SVN,但实际上并没有在初始分支上提交任何内容,然后在切换到另一个分支以及切换回master时给出了错误。当我重复这些步骤以捕获要在此处发布的输出时,它立即给出了错误。回顾命令历史,我看不出有什么不同。无论如何,我仍然无法放弃。
-r 1:2
解决方法
要使git-svn正常工作,必须首先与现有svn存储库同步,这样它才能知道当前的修订版本,并可以创建新的提交。如果存储库完全空白且没有初始提交,则无法与之同步。
您应该在SVN存储库中创建一个空白的初始提交,然后从那里进行同步和dcommit。
否则,如果您坚持要与空白svn仓库同步,则可以尝试手动更新ref,使其看起来像是基本的svn提交。然后,当您执行dcommit时,git-svn将看到“假基本提交”,并将您的更改作为svn提交进行提交。唯一的警告是,您将必须基于此空提交来重新构建您的存储库。我什至不确定SVN信息库是否会接受提交。