深入研究一下,我发现 git在'ingsvn:mergeinfo
时支持在 SVN 分支上设置属性:dcommit
git svn dcommit --mergeinfo "/branches/somebranch:1-3"
注意!svn:mergeinfo
被命令行上给出的任何内容覆盖,所以也要小心列出以前的合并。
虽然最近的 git 版本添加了 config 参数来自动设置这个属性:
config key: svn.pushmergeinfo
我在使用自动合并信息时遇到了一些问题——出于某种原因或其他 GIT 计算错误,我无法让它工作。
解决方案:git-merge-svn
为了自动化这个过程,我编写了一个 shell 脚本git-merge-svn,它可以用来合并两个svn:mergeinfo
dcommit 上正确设置的 SVN 分支。
该脚本处理两种情况:
- 分支没有在 git 中合并 - 会
git merge
事先做
- 分支已经在 git 中合并(但不在 SVN 中) - 将遍历直到合并提交修订的前一个祖先。
使用此脚本,我能够仅在 git 端生成这些合并并保留合并信息,以便 GIT 图表很好地显示日志:
示例用法:
- 在devel6上做一些提交
dcommit
devel6到 SVN(需要获取提交的 SVN 修订号)
- 查看testtunk6 - 是的,我知道我的名字打错了 ;-)
git merge-svn devel6
最后一条命令输出:
% 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