我有一个非常大的svn存储库(将近6000个修订版),需要迁移到git。存储库托管在内部服务器上。我想把所有的历史记录、标签和版本迁移到git,并用git格式创建分支等。
到目前为止,我已经在我的机器上安装了tortoisesvn,并且一直在尝试使用git svn clone,但是,很多文件夹太大,我得到块大小错误。同时,有些文件的文件路径中有非法字符,因此在迁移过程中会被跳过。
我也曾尝试使用TortoiseSVN将工作副本签入本地计算机,然后尝试通过设置本地svnserve
(设置为Windows服务)将其迁移,但是,我永远无法使用svn://localhost/...
访问文件我遵循指南(https://subversion.open.collab.net/articles/svnserve-service.htm)将其设置为服务,并且我可以访问例如svn://localhost/dev
,但是,当我通过tortoise将文件签入这个文件夹时,它不会通过svn://localhost/dev/<sub-folder>
看到它们,显然我做错了,但是,我不确定是什么。
结构如下:
repository (top level)
- folder 1
- sub-folder 1
- sub-folder 2
- ...
- folder 2
- sub-folder 1
- ...
- ...
最后,我尝试过使用svn2git,但在这种情况下也会出现错误。
迁移的最佳方式是什么和/或我做错了什么?
感谢您的帮助!
最佳答案
对于一次性迁移,git-svn
不是用于转换存储库或部分存储库的正确工具。如果您想使用Git作为现有的VPN服务器的前端,这是一个很好的工具,但是对于一次性转换,您不应该使用git-svn
,但是svn2git
它更适合这个用例。
有很多称为svn2git
的工具,最好的可能是https://github.com/svn-all-fast-export/svn2git中的kde工具。我强烈建议使用svn2git
工具。这是我所知道的最好的,它可以很灵活地处理它的规则文件。
我猜你用的是Nirvdrum。这个函数有效地调用svn2git
,然后进行一些后处理,以克服git-svn
的一些缺点,但是您会得到与git-svn
相同的错误。
您将能够很容易地配置git-svn
规则文件,以从当前的VPN布局中生成所需的结果,包括可能存在的任何复杂历史,包括从一个VPN回购中生成几个Git副本,或者在一个运行中将不同的SN RePs组合成一个Git回购,如果您愿意的话。
如果您不是100%了解存储库的历史,svn2git
fromhttp://blog.hartwork.org/?p=763是一个很好的工具,可以在将svn存储库迁移到git时调查其历史。
尽管svneverever
或NrvLultgit-svn
更容易开始,但这里还有一些进一步的理由,为什么使用KDE svn2git
而不是svn2git
是优越的,除了它的灵活性:
通过git-svn
(如果使用正确的方法)可以更好、更清晰地重建历史,对于分支和合并等更复杂的历史尤其如此
标记是真正的标记,而不是git中的分支。
使用svn2git
时,标记包含一个额外的空提交,这也会使它们不属于分支,因此正常的git-svn
在您将fetch
交给命令之前不会获取它们,因为默认情况下,也只获取指向已获取分支的标记。有了合适的svn2git标签
如果您在svn中更改了布局,您可以使用--tags
轻松配置它,使用svn2git
您最终将丢失历史记录
使用git-svn
还可以轻松地将一个svn存储库拆分为多个git存储库
或者将同一个svn根目录中的多个svn存储库轻松组合到一个git存储库中
正确的svn2git
比正确的svn2git
转换快上百万倍。
你看,git-svn
更差,kdegit-svn
更优的原因有很多。:-)