Git-svn可以用于大型分支存储库吗?

20

我试图将Git作为一个前端来使用SVN仓库,以便能够使用Git的一些很棒的功能,如简单分支、藏匿等。

问题是SVN仓库相当大(8,000个版本),并且包含许多分支和标记(旧的和新的)。

它几乎是一个标准的布局,其中包含了fetch、branches和tags指令的配置文件。

由于最老的分支和标记参考了第10个版本,这意味着每次svn fetch都会从版本10开始读取整个仓库历史记录并向前推进,这可能需要花费数小时的时间在慢速连接上。

如果只跟踪主干,那就没问题了,但我仍然希望使git意识到新的分支和标记。

通常我查看我所在的分支上的git log -1,并从注释中获取SVN版本,这样我就可以执行git svn fetch -r7915:HEAD或类似的操作。我猜这就是git svn fetch --parent的作用。但我为什么需要这样做呢?

我在Windows上使用TortoiseGit,它对git-svn具有相当不错的支持,但由于TortoiseGit只运行git svn fetch,所以我有点卡住了。

我做错了什么吗?我期望svn fetch在第一次完成svn clone -s后是一个快速操作。

4个回答

12

感谢您的答复,虽然它们没有真正帮助我。

到目前为止,该命令是最好的解决方案:

git svn log --all -1 | \
  sed -n '2s/r\\([0-9]*\\).*/\\1/p' | \
  xargs --replace=from git svn fetch -r from:HEAD

它使用 git svn log --all 查找迄今为止获取的最高 SVN 修订号,并从该点开始获取所有内容。

我希望 git svn fetch 能有一个像这样的选项。除非修改了 SVN 修订版本,否则没有理由让 git svn 每次都重复获取相同的修订版本。


感谢您在这里发布此内容。许多人正在寻找使用Git与其他源代码控制系统的方法。 - Jordan
1
在我的 SVN 存储库中,由于提交记录过多,上述命令执行起来非常缓慢 -- 它会强制 git-svn 回到存储库的开头查找历史记录。 - MikeHoss
工作副本的HEAD修订版本为: git svn find-rev HEAD 因此,获取最后一次提取到远程HEAD修订版本的最短方式是: git svn fetch -r \git svn find-rev HEAD`:HEAD` - Sam Hasler

5

如果您正在尝试使用git来解决svn的缺点,但在无法完全切换的环境中,这是一个不错的解决方法。您并不需要它成为完整的subversion客户端,只需为您提供一些git的功能即可。写得很好。 - captncraig
我也喜欢@Jordan发布的链接中描述的“git + svn”方法。然而,NetBeans(7.0.1)似乎无法使用它。它将项目标识为Subversion checkout,但无法看到其中的git repo。 - michael

3
您使用的很正确:导入具有大量历史记录的Subversion存储库将非常缓慢。
不幸的消息是,由于Subversion的分支和标记仅是目录,因此git-svn被迫采取悲观路线,从每个分支的头开始一直读取到第一个修订版本。是的,如果您在使用Subversion时很有纪律性,这将导致重复获取相同数据的情况,但实际使用模式使得这种情况不太可能发生。
在晚上开始克隆,第二天早上回来就会有一个漂亮的git repo!
一旦克隆完成,git svn fetch甚至会警告您:
这可能需要一段时间才能完成大型存储库的操作
Subversion很简单愚蠢,所以git必须慢慢来。

1
谢谢您的回答。我没有问题,初始克隆需要时间,但是之后的每个获取操作都必须经过几乎所有修订似乎是错误的。 - Henrik Steensland

0

你的 SVN 仓库中有符号链接吗? 如果没有,你尝试过这个设置吗:

svn.brokenSymlinkWorkaround

这将禁用潜在昂贵的检查,以解决由损坏的客户端检入 SVN 的破碎符号链接。如果您跟踪一个包含许多不是符号链接的空 blob 的 SVN 仓库,请将此选项设置为“false”。此选项可以在 git svn 运行时更改,并在下一次获取的修订版本上生效。如果未设置,则 git svn 假定此选项为“true”。


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