我已经阅读了很多关于git-svn和合并的SO问题和博客.其中一些(特别是git-svn手册页)警告不要在我计划的分支附近使用合并dcommit.
其他人,比如这个SO答案,说明合并很好,只要我使用之前删除的一次性功能分支dcommitting.
我有两个长寿SVN(和git)分支的设置:
svn/trunk,git :) master- 稳定分支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 merge事先做使用这个脚本,我只能在git端生成这些合并并保留合并信息,以便GIT图很好地显示日志:

用法示例:
dcommit devel6到SVN(需要获取提交的SVN修订号)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)