如何使用SVN检出整个代码库包括所有历史记录、标签和版本?

5
我有一个非常大的 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,但是在这种情况下我也遇到了错误。

什么是最佳迁移方式?或者说我哪里做错了?感谢任何帮助!


你必须转换存储库(repository),而不是WC(checkout的结果)。你可以将repo复制到本地驱动器上并运行svnserve(用于超时和块大小问题),或将长时间历史记录分成较小的部分... - Lazy Badger
1个回答

5

对于一次性迁移来说,git-svn不是将存储库或存储库部分进行转换的正确工具。如果您想要使用Git作为现有SVN服务器的前端,则它是一个很好的工具,但是对于一次性转换,您不应该使用git-svn,而应该使用更适合这种用例的 svn2git

有许多名为svn2git的工具,可能最好的工具是来自KDE的工具https://github.com/svn-all-fast-export/svn2git。我强烈推荐使用那个svn2git工具。它是我知道的最好的可用工具,在您可以使用其规则文件完成的所有内容方面都非常灵活。

我猜你使用了nirvdrum的svn2git。那个工具实际上调用了git-svn,然后进行了一些后处理以克服git-svn的一些缺点,但您当然会遇到与git-svn相同的错误。

您将轻松能够配置svn2git规则文件,以从当前的SVN布局中产生您想要的结果,包括可能存在的任何复杂历史记录,并且可以在一次运行中干净地将一个SVN仓库生成多个Git仓库或将不同的SVN仓库合并为一个Git仓库。

如果您对存储库的历史记录不确定,请使用来自http://blog.hartwork.org/?p=763svneverever进行调查,以便将其迁移到Git。


尽管git-svn或nirvdrum的svn2git更易于入手,但以下是使用KDE的svn2git而不是git-svn更优越的进一步原因,除了其灵活性:

  • svn2git可以更好、更干净地重建历史(如果使用正确的工具),特别是对于包含分支和合并等复杂历史的情况
  • 在Git中,标签是真正的标签而不是分支
  • 使用git-svn时,标签包含一个额外的空提交,这也使它们不属于分支,因此默认情况下只有指向已获取分支的标签才会被获取。使用正确的svn2git工具,标签位于其应该存在的位置
  • 如果你在SVN中更改了布局,你可以轻松地使用svn2git进行配置,但使用git-svn最终将失去历史记录
  • 使用svn2git,你还可以轻松地将一个SVN存储库拆分为多个Git存储库
  • 或者将同一SVN根目录中的多个SVN存储库合并为一个Git存储库
  • 使用正确的svn2git比使用git-svn转换速度快得多

你看,有很多理由说明为什么git-svn不如KDE的svn2git优秀。:-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接