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

时间:2010-01-08 17:48:45

标签: svn git git-svn tortoisegit

我正在尝试使用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 个答案:

答案 0 :(得分: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无法在每次重复修改相同的修订版本。

答案 1 :(得分:5)

如果您不需要在git存储库中拥有完整的历史记录,我建议您查看下面链接中详细介绍的“git + svn”方法,而不是标准的git-svn集成。您最初导入git应该非常快,因为您不会导入历史记录。

请务必阅读标题为“福利,缺点和经验教训”的部分。

http://www.lostechies.com/blogs/derickbailey/archive/2010/02/03/branch-per-feature-how-i-manage-subversion-with-git-branches.aspx

答案 2 :(得分:3)

您正确使用它:初始导入包含大量历史记录的Subversion存储库将非常缓慢。

坏消息是因为Subversion的分支和标签只是目录,git-svn被迫采取悲观的路径从头部一直读回第一个修订版。是的,如果您在使用Subversion时受到纪律处分,这将导致许多相同数据的提取,但实际使用模式使这种情况不太可能。

晚上开始克隆,第二天早上回到一个漂亮的git repo!

克隆后,git svn fetch甚至会警告你:

This may take a while on large repositories

Subversion简单而愚蠢,所以git必须慢慢来。

答案 3 :(得分:0)

你在SVN回购中有符号链接吗? 如果没有,您是否尝试过此设置:

  

svn.brokenSymlinkWorkaround

     

这会禁用可能代价高昂的检查以解决方法   符号链接通过破坏检入SVN   客户端。如果,请将此选项设置为“false”   您跟踪SVN存储库有很多   不是符号链接的空blob。   git可以更改此选项   svn正在运行并生效   获取下一个修订版。如果没有设置,git   svn假定此选项为“true”。