SVN to Git使用快速导入/导出流

时间:2014-01-07 20:23:23

标签: git svn git-svn reposurgeon

我一直致力于将~32,000次提交的SVN回购转换为任何DVCS(Git,Bazaar,Mercurial,Plastic SCM)。一两个星期后,我意识到最好的选择是将SVN repo转换为Git,获得快速导出流,并将.fe流导入任何DVCS,因为它们都支持git快速导出/导入方法。

我在互联网上尝试了一切:在Windows 7和Linux Ubuntu上都有。由于回购的大小,我使用reposurgeon和git-svn取得了最大的成功。但同样,由于尺寸的原因,这两种工具都无法一次性转换完整的回购。我也尝试过SubGit,虽然它有效,但极其慢(处理1060次提交约24小时)。

所以我想我可以分别转换repo(主干,分支,标签,自定义文件夹)中的每个文件夹,然后在Git中组合。然后我意识到这是不可能的,因为git的repo结构与SVN明显不同。

我的问题是,是否可以使用上面的方法并使用一些魔法,将单独的转换合并为一个Git仓库?

基本上我需要为我的SVN仓库获得一个快速导出/导入流,以将其转换为另一个DVCS,并认为Git中间步骤最简单。成功转换有哪些其他选项可用?

提前致谢。

2 个答案:

答案 0 :(得分:3)

单独转换文件夹并组合git存储库原则上应该有效,但要做到正确会非常棘手,所以我建议不要 它

无论如何,32,000次提交并不多,git-svn应该可以 处理它,虽然它可能需要一天左右。 但是,如果它太慢,你将不得不尝试一下。

可以减缓git-svn克隆操作的事情

SVN存储库速度

首先,当然是SVN存储库速度。尝试创建SVN存储库的本地镜像(使用svnadmin dump/loadsvnsync),然后克隆它。

“子目录”分支/标签

分支或标签(git处理相同)可能会成为一个问题。每当git-svn clone遇到一个SVN分支一个trunk的副本,而是一个子目录的副本时,它将重新读取分支子目录的整个SVN历史记录,因为它的创建< / em>(您可以在git svn clonehere is an explanation by the author的输出中看到这一点。这意味着克隆的速度不仅与SVN修订版n的数量成正比,而且与“子目录分支”b的数量成正比,即如果b = 10,则克隆可能需要长达10倍​​。

这个问题没有简单的解决办法。首先,你可以尝试克隆没有标签 - 通常标签只是反转到SVN修订版ID,所以有一个标签列表就足够了(除非你的标签包含变化......呃)。如果这还不够,也可以跳过一些分支......虽然你必须决定是否有你可以做的。

极端的解决方案是使用选项--no-follow-parent。这将阻止git svn从一开始就重新读取分支。分支仍将被读取,但是,它们将不会连接到历史的其余部分。这仍然告诉你在那里做了什么,但是让他们很难合并。


最后,请注意您可以中断并恢复克隆过程。要恢复,请运行git svn fetch。 您可能需要多次重启,但有一点耐心,克隆应该通过。

答案 1 :(得分:0)

复述一个非常老的问题,但我认为答案可能对某人有用。

您可能想尝试svn-all-fast-export / svn2git。几年前,我将一个约3500k提交的旧SVN存储库转换为Git,同时还将其拆分为几个单独的Git存储库。我在笔记本电脑上有SVN存储库的本地副本,只花了大约15分钟的时间(这很棒,因为我必须多次运行转换,然后才能对结果感到满意;)。我还使用BFG Repo-Cleaner对转换后的Git存储库进行后处理。

svn-all-fast-export / svn2git并不是最简单的软件,我不得不多次阅读源代码以真正了解正在发生的事情。您可能需要查看有关此主题的其他答案,以获取一些提示:svn-all-fast-export: Match file names