Git-svn合并了两个SVN分支

Laa*_*aas 16 git git-svn

我已经阅读了很多关于git-svn和合并的SO问题和博客.其中一些(特别是git-svn手册页)警告不要在我计划的分支附近使用合并dcommit.

其他人,比如这个SO答案,说明合并很好,只要我使用之前删除的一次性功能分支dcommitting.

我有两个长寿SVN(和git)分支的设置:

  • trunk(git-svn:svn/trunk,git :) master- 稳定分支
  • branches/devel(git-svn:svn/devel,git :) devel- 我从中分支功能分支的主要开发分支(我可以将它们重新定位devel而不是合并).

源树中当前状态的快照

在上图中,(1)显示了过去的SVN历史,branches/devel已合并到哪里trunk.

(2)表明我已经成功将dcommitted当前的开发重新纳入SVN.

问题:我可以git-svn用来合并两个SVN分支,以便历史记录显示合并点(如SVN本身可以做的那样)吗?换句话说:如果我是dcommit(3)master所示的那样会发生什么?

这会弄乱我的SVN(或git)历史吗?或者这只是简单地忘记了devel被合并进去master了吗?

编辑:如果git只是忘记devel合并master,dcommiting从点(3)到将所有提交作为单个补丁应用有区别吗?

Laa*_*aas 14

再深入研究一下,我发现git支持svn:mergeinfo在SVN分支上设置属性dcommit:

git svn dcommit --mergeinfo "/branches/somebranch:1-3"
Run Code Online (Sandbox Code Playgroud)

NB!用命令行中给出的svn:mergeinfo内容覆盖它,所以要小心列出以前的合并.

虽然更新的git版本添加了config参数来自动设置此属性:

config key: svn.pushmergeinfo
Run Code Online (Sandbox Code Playgroud)

我对自动mergeinfo有一些麻烦 - 由于一个原因或另一个GIT计算错误而我无法让它工作.

解决方案:git-merge-svn

为了自动化这个过程,我写了一个shell脚本git-merge-svn,它可以用来svn:mergeinfo在dcommit上合并两个SVN分支和正确的set.

该脚本处理两种情况:

  • 分支没有在git中合并 - 将git merge事先做
  • 分支已经在git中合并(但不在SVN中) - 将遍历前一个祖先的合并提交修订.

使用这个脚本,我只能在git端生成这些合并并保留合并信息,以便GIT图很好地显示日志:

git-merge-svn结果

用法示例:

  1. devel6上做一些提交
  2. dcommit devel6到SVN(需要获取提交的SVN修订号)
  3. 看看testtunk6 - 是的,我知道我在名字上写了一个拼写错误;-)
  4. git merge-svn devel6

最后的commant输出:

% git merge-svn devel6
About to do an SVN merge: devel6 -> testtunk6

* NEW MERGE COMMIT
|\
| * devel6 [7b71187] (r102)
* | testtunk6 [0682a45] (r101)
 \|
  * [273d6d6] (r100)


STEP 1: GIT merge
Executing:
  git merge devel6

Continue? (y/n) [n]: y
Merge made by the 'recursive' strategy.
 testfile | 1 +
 1 file changed, 1 insertion(+)

STEP 2: SVN dcommit

executing:
git svn dcommit --mergeinfo
/idp/branches/devel:9-32,35-41 /idp/branches/devel6:89 /idp/branches/devel6:94 /idp/branches/devel6:93 /idp/branches/devel6:96 /idp/branches/devel6:97 /idp/branches/devel6:99 /idp/branches/devel6:100 /idp/branches/devel6:102

Continue? (y/n) [n]: y
Committing to https://my.svn.host/svn/auth/idp/branches/testtunk6 ...
  M testfile
Committed r103
  M testfile
Found merge parent (svn:mergeinfo prop): 7b71187fc371d3f86658c5850009e63be88157ac
r103 = 87759323cbadd38bac78087d57b6870a926287e7 (refs/remotes/svn/testtunk6)
No changes between 3fb2168cfbbe605fbd810d76513443203a85a549 and refs/remotes/svn/testtunk6
Resetting to the latest refs/remotes/svn/testtunk6
Run Code Online (Sandbox Code Playgroud)