我一直致力于将~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中间步骤最简单。成功转换有哪些其他选项可用?
提前致谢。
答案 0 :(得分:3)
单独转换文件夹并组合git存储库原则上应该有效,但要做到正确会非常棘手,所以我建议不要 它
无论如何,32,000次提交并不多,git-svn
应该可以
处理它,虽然它可能需要一天左右。
但是,如果它太慢,你将不得不尝试一下。
首先,当然是SVN存储库速度。尝试创建SVN存储库的本地镜像(使用svnadmin dump/load
或svnsync
),然后克隆它。
分支或标签(git处理相同)可能会成为一个问题。每当git-svn clone
遇到一个SVN分支不一个trunk的副本,而是一个子目录的副本时,它将重新读取分支子目录的整个SVN历史记录,因为它的创建< / em>(您可以在git svn clone
和here 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