我正在使用“git svn”与具有非标准分支约定的大型 SVN 存储库进行交互。我看到有多种方法可以克隆 svn repo / 分支,如此处所指出
我看到了非常不同的行为:
假设SVN repo如下:
http://svn.mycom.com/svn/Project
-->trunk
-->defects
-->uat
生产在“主干”,分支在“缺陷”,当前开发在“uat”。
话虽如此,我可以执行以下操作
1.克隆直接uat..
$ git svn clone http://svn.mycom.com/svn/Project/uat
当我这样做时,我的 .git/config 文件如下所示:
[svn-remote "svn"]
url = http://svn.mycom.com/svn/Project/uat
fetch = :refs/remotes/trunk
然后我添加了如此处所述的分支 我的 .git/config 看起来类似于:
[svn-remote "svn"]
url = http://svn.mycom.com/svn/Project/uat
fetch = :refs/remotes/trunk
[svn-remote "task1"]
url = http://svn.mycom.com/svn/Project/defects/task1
fetch = :refs/remotes/task1
现在当我跑
$git log --decorate --all --graph
我看到我的新分支只有 1 次提交,即。分支创建它与要掌握的实际历史无关。它显示了自己的历史记录线,与之前的提交没有任何联系。
2. 使用 -T 克隆然后添加分支 我发现的替代解决方案是:
$git svn clone http://svn.mycom.com/svn/Project/ -T uat Project --no-minimize-url
Since the "Defects" has lot many branches, and it would take hours, i then did:
[svn-remote "svn"]
url = http://svn.mycom.com/svn/Project
fetch = uat:refs/remotes/trunk
branches = defects/{task1}:refs/branches/*
这似乎很好用,我确实了解了历史。我想知道两者中更好的方法是什么,如果有什么我需要考虑从一个选项与另一个选项之间进行选择的话。但是,在这个选项中,如果我必须添加另一个分支,我不能简单地在逗号分隔列表中编辑分支部分和新分支名称,例如分支 = 缺陷/{task1,task2}。这不起作用感觉就像一个 GIT 缺陷。然后,我只需在分支下方添加另一条提取线
[svn-remote "svn"]
url = http://svn.mycom.com/svn/Project
fetch = uat:refs/remotes/trunk
branches = defects/{task1}:refs/branches/*
fetch = defects/task2:refs/branches/task2
这很好用,我得到了分支历史记录并且能够在没有问题的情况下切换。但感觉就像一个黑客。我希望有一种方法可以将它附加到看起来很干净的分支列表中。