在我做了 git svn clone --stdlayout ... 之后,一切看起来都不错,我已经转换了远程分支。但是当 git log --graph 时,我没有看到任何分支合并图。这是正常的吗?
答案 0 :(得分:5)
自2008年夏季发布的1.5.0版以来,Subversion确实支持合并跟踪。 Subversion将执行合并的信息保存为合并目标上设置的 svn:mergeinfo 属性,可以是分支目录,如 ^ / trunk / ,也可以是任何其他目录。
Git和Subversion中的合并跟踪机制之间存在重大差异:
整个分支合并。
当你在主分支上时,命令
$ 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属性只指定曾经合并到分支中的那些修订。并且由用户来检查所有这些合并的修订是否包括分支的整个历史。
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跟踪樱桃选择合并。
因此,您不会在翻译后获得合并提交。据我所知,git-svn在合并历史方面存在一些问题。
但作为subgit开发人员,我不得不说subgit应该正确处理合并跟踪信息。很可能在您的分支上设置的 svn:mergeinfo 属性不包括合并到它们的分支的整个历史。以下是这种情况:
要解决此问题,您必须找到合并跟踪信息的跳过部分并将其添加到您的分支中:
尝试查找尚未合并的修订版本:
$ svn mergeinfo --show-revs eligible ^/branches/some-branch/@HEAD ^/trunk/@HEAD
输出必须包含尚未从 ^ / branches / some-branch / 合并到 ^ / trunk / 的所有修订。
< / LI>尝试通过svn合并尚未合并的修订。
作为一个很好的奖励你可以参考与合并跟踪相关的SubGit specification,它有一些漂亮的图表,我已经说过了。
答案 1 :(得分:1)
Subversion在svn:mergeinfo属性的帮助下跟踪合并。虽然历史记录可能不会被工具显示为,但它本质上不是线性的。实际上svn:mergeinfo比Git合并提交更强大(虽然这种功能可能没有实际用途)
像SubGit这样的工具确实会在可能的情况下将svn:mergeinfo转换为合并提交。
我正在研究我推荐的工具(SubGit),但实际上git-svn在两个方向上的合并翻译方面都非常弱。
答案 2 :(得分:0)
使用git-svn不会改变SVN本身具有线性历史的事实,因此从技术上讲,所有合并都是快速转发的。没有合并提交,因此图中也没有合并。