git svn在大型存储库中分支

git svn在大型存储库中分支,git,svn,git-svn,Git,Svn,Git Svn,我正在使用“git svn”与一个具有非标准分支约定的大型svn回购进行交互。 我发现有多种方法可以克隆svn回购/分支,正如前面指出的那样 我看到了真正不同的行为: 假设SVN回购协议如下所示: http://svn.mycom.com/svn/Project -->trunk -->defects -->uat 生产处于“主干”,分支处于“缺陷”,当前发展处于“uat” 这么说来,我可以做到以下几点 1。克隆直接uat.. $ git svn clone http://s

我正在使用“git svn”与一个具有非标准分支约定的大型svn回购进行交互。 我发现有多种方法可以克隆svn回购/分支,正如前面指出的那样

我看到了真正不同的行为:

假设SVN回购协议如下所示:

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
然后,我添加了如上所述的分支 My.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
我看到我的新分支只有一个提交,即分支创建,它与要掌握的实际历史无关。它显示自己的历史记录行,与以前的提交没有任何连接

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/*
这似乎很有效,我确实了解历史。我想知道这两种方法中哪一种更好,如果我需要考虑从一种选择到另一种选择的话。 但是在这个选项中,如果我必须添加另一个分支,我不能简单地在逗号分隔的列表中编辑分支部分和新的分支名称,比如branchs=defects/{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

这很好,我得到了分支历史记录,并且能够切换w/o问题。但感觉就像一个黑客。我希望有一种方法可以将它添加到分支列表中,这样看起来会很干净。

我使用并且更喜欢第二种方法,这是IMO正确的方法。通过第二种方式,您将拥有存储库的所有历史记录,并且可以轻松地在所需的分支之间切换。
我还认为,如果您要在本地创建一个新分支,然后将其提交给
SVN

使用几天后,第一种方法会给您带来一些问题,最好的选择是选项2

注意:不要为以后创建的新分支添加“fetch”行。我发现添加新的分支名称作为列表上的第一件事,就成功了。已提取新的分支信息

[svn-remote "svn"]
 url = http://svn.mycom.com/svn/Project
 fetch = uat:refs/remotes/trunk
 branches = defects/{task2,task1}:refs/branches/*
如果这样做没有拉入分支,只需删除“.git/svn/.metadata”文件夹并运行

git svn fetch

它基本上会重新获取信息,但至少看起来很干净。添加fetch行也可以。就我个人而言,这两种方式我都不在乎。如果你很细心,你可以像上面提到的那样添加分支。

谢谢Atropo,我同意,顺便问一下,你以后如何添加新分支?我不能简单地在逗号分隔的列表中添加新的分支名称:(