3

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

我已经尝试了互联网上的所有内容:在 Windows 7 和 Linux Ubuntu 上。由于 repo 的大小,我使用 reposurgeon 和 git-svn 取得了最大的成功。但是同样,由于大小的原因,这两种工具都无法一次性隐藏完整的 repo。我也尝试过 SubGit,虽然它可以工作,但速度极慢(处理 1060 次提交约 24 小时)。

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

我的问题是,是否可以使用我上面的方法并通过一些魔法将单独的转换组合到一个 Git 存储库中?

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

提前致谢。

4

2 回答 2

4

单独转换文件夹并组合 git 存储库原则上应该可以工作,但要正确处理会非常棘手,所以我建议不要这样做。

无论如何,32,000 次提交并不算多,git-svn应该能够处理它,尽管可能需要一天左右的时间。但是,如果速度太慢,您将不得不进行一些实验。

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

SVN 存储库速度

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

“子目录”分支/标签

分支或标签(git 对待它们的方式相同)可能会成为问题。每当git-svn clone遇到一个不是主干副本而是子目录副本的 SVN 分支时,它将重新读取分支子目录自创建以来的整个 SVN 历史记录(您可以在 的输出中看到这一点,git svn clone是由作者)。这意味着克隆的速度不仅与 SVN 修订的数量成正比n,还与“子目录分支”的数量成正比b,即如果b = 10,则克隆可能需要长达 10 倍的时间。

这个问题没有简单的解决方案。首先,您可以尝试不带标签的克隆 - 通常标签只是恢复为 SVN 修订 ID,因此拥有标签列表就足够了(除非您有包含更改的标签......呃)。如果这还不够,也许还跳过一些分支......虽然你必须决定是否有任何你可以不用的。

极端的解决方案是使用 option --no-follow-parent。这将防止git svn从头开始重新读取分支。仍然会读取分支,但是,它们不会连接到历史的其余部分。这仍然向您展示了那里所做的事情,但是使它们很难合并回来。


最后,请注意您可以中断和恢复克隆过程。要恢复,请运行git svn fetch. 您可能需要重新启动几次,但请耐心等待克隆应该通过。

于 2014-01-11T01:17:36.767 回答
4

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

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

svn-all-fast-export / svn2git 不是最直接的软件,我不得不阅读源代码几次才能真正理解发生了什么。您可能想查看我关于此主题的其他答案以获取一些提示:svn-all-fast-export:匹配文件名

于 2018-07-10T12:47:02.197 回答