在“git svn clone”之后,我仍然没有很棒的分支合并提交?

时间:2011-11-24 18:08:51

标签: git git-svn

在我做了 git svn clone --stdlayout ... 之后,一切看起来都不错,我已经转换了远程分支。但是当 git log --graph 时,我没有看到任何分支合并图。这是正常的吗?

3 个答案:

答案 0 :(得分:5)

自2008年夏季发布的1.5.0版以来,Subversion确实支持合并跟踪。 Subversion将执行合并的信息保存为合并目标上设置的 svn:mergeinfo 属性,可以是分支目录,如 ^ / trunk / ,也可以是任何其他目录。

Git和Subversion中的合并跟踪机制之间存在重大差异:

  1. 整个分支合并。

    当你在分支上时,命令

    $ git merge some-branch
    

    导致合并提交,其第一个父级设置为 master 引用的提交,第二个父级设置为 some-branch 引用的提交(我不是在这里考虑快进和冲突的合并。)

    对于git,这意味着创建的合并提交包括 master some-branch 整个历史记录

    当您检出 ^ / trunk / 分支到svn工作副本然后运行

    $ svn merge ^/branches/some-branch trunk-working-copy
    

    Subversion将在trunk-working-copy目录中设置 svn:mergeinfo 属性,如下所示:

    /branches/some-branch:10-20,30-40,50-60
    

    范围 10-20,30-40,50-60 包括那些尚未合并到 ^ / trunk / 分支的修订版 ^ / branches / some-branch / (Subversion自动检测它们)。

    Mergeinfo属性只指定曾经合并到分支中的那些修订。并且由用户来检查所有这些合并的修订是否包括分支的整个历史

  2. Cherry-pick merge。

    如果需要将来自单个提交的更改合并到分支中,则运行

    $ git cherry-pick bc347a8
    

    之后,git创建一个提交,其中包含相应的更改,并且单个父级设置为先前由 master 分支引用的提交。

    也就是说,git不会为cherry-pick创建任何类型的合并提交。因此,git无法通过其图形结构跟踪樱桃选择的提交。

    与Subversion相反,通过调整 svn:mergeinfo 属性来跟踪樱桃选择合并:

    $ svn merge -c100 ^/branches/some-branch trunk-working-copy
    

    这个命令很简单,它按如下方式调整 svn:mergeinfo

    /branches/some-branch:100
    

    这意味着Subversion跟踪樱桃选择合并。

  3. 因此,您不会在翻译后获得合并提交。据我所知,git-svn在合并历史方面存在一些问题。

    但作为subgit开发人员,我不得不说subgit应该正确处理合并跟踪信息。很可能在您的分支上设置的 svn:mergeinfo 属性不包括合并到它们的分支的整个历史。以下是这种情况:

    • 您使用过旧的svn客户端(< 1.5),因此您的分支机构没有足够的合并跟踪信息。
    • 您已经执行了挑选,并且在添加到 svn:mergeinfo 中时跳过了一些修订范围。
    • 你有 svn:mergeinfo 设置在不是分支目录的目录上,即它们不是 ^ / trunk / ^ / branches / some-branch 等(标准布局)。

    要解决此问题,您必须找到合并跟踪信息的跳过部分并将其添加到您的分支中:

    1. 尝试查找尚未合并的修订版本:

      $ svn mergeinfo --show-revs eligible ^/branches/some-branch/@HEAD ^/trunk/@HEAD
      

      输出必须包含尚未从 ^ / branches / some-branch / 合并到 ^ / trunk / 的所有修订。

      < / LI>
    2. 尝试通过svn合并尚未合并的修订。

      • 如果您认为所有更改已合并,请使用svn merge命令的--record-only选项;
      • 如果您不太确定,最好执行正常的svn合并,这将应用所有缺失的更改。
    3. 使用subgit你也可以通过git方法合并,然后将创建的合并提交推送到subgit powered repository,这样它就会将这些合并提交转换为svn版本,并使用正确的svn:mergeinfo。
    4. 作为一个很好的奖励你可以参考与合并跟踪相关的SubGit specification,它有一些漂亮的图表,我已经说过了。

答案 1 :(得分:1)

Subversion在svn:mergeinfo属性的帮助下跟踪合并。虽然历史记录可能不会被工具显示为,但它本质上不是线性的。实际上svn:mergeinfo比Git合并提交更强大(虽然这种功能可能没有实际用途)

SubGit这样的工具确实会在可能的情况下将svn:mergeinfo转换为合并提交。

我正在研究我推荐的工具(SubGit),但实际上git-svn在两个方向上的合并翻译方面都非常弱。

答案 2 :(得分:0)

使用git-svn不会改变SVN本身具有线性历史的事实,因此从技术上讲,所有合并都是快速转发的。没有合并提交,因此图中也没有合并。