2

我正在使用“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

这很好用,我得到了分支历史记录并且能够在没有问题的情况下切换。但感觉就像一个黑客。我希望有一种方法可以将它附加到看起来很干净的分支列表中。

4

2 回答 2

1

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

于 2013-04-08T16:01:31.923 回答
0

使用它几天后,最好的选择是选项#2。

注意:而不是为稍后创建的新分支添加“获取”行。我发现添加新的分支名称作为列表中的第一件事,就可以了。新的分支信息被拉取。

[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 行也很好。就我个人而言,我不在乎。如果你很细致,你可以像上面提到的那样添加分支。

于 2013-04-11T17:48:57.627 回答