如文档中所述,该hg backout
命令在与合并变更集一起使用时可能会导致问题。我们最近有几个案例,新开发人员退出合并变更集,并导致我们希望在所有内容重新合并在一起时保留的代码被还原。
为了避免这种情况,我试图想出一个好方法来防止这种情况发生。有没有一种很好的通用方法可以编写一个钩子或完全禁用退出命令?
(我们的标准开发人员设置的一部分是安装一组自定义扩展,所以我已经有了一个很好的方法来为我们整个开发团队在本地安装这些类型的规则——我只是没有想到一个好的方法来实现规则集。)
那这个呢:
$ hg --version
Mercurial Distributed SCM (version 2.6.3)
...
$ hg log --graph --template='{rev} {desc}'
@ 5 c5
|
o 4 merge
|\
| o 3 c4
| |
o | 2 c3
|/
o 1 c2
|
o 0 c1
$ hg backout 4
abort: cannot backout a merge changeset
所以看起来 Mercurial 默认会做你想做的事。也许您需要更新的 Mercurial 版本。
如果你坚持使用旧的 Mercurial 版本,这里有一个 hacky 钩子(用于 *nix/Bash),它会中止合并的回退:
[hooks]
pre-backout=REV=`echo $HG_PATS | sed -e "s/[^0-9]//g"`; test `hg log -r "parents($REV)" --template='{node}\n' | wc -l` -eq 1 || { echo 'do not do that'; exit 1; }
它从中提取修订号$HG_PATS
,然后使用hg log
andwc
来计算相关修订的父级数量。如果有多个父级,则为合并。
尽管如此,我还是强烈建议您使用最新的 Mercurial:查看发行说明以了解您缺少的令人兴奋的功能。
这是一个简单的基于 Python 的钩子,可以防止退出合并。感谢@Oben 为我指明了正确的方向。
def prebackout_prevent_backout_merge( ui, repo, **kwargs ):
'''Don't allow backouts to of merge changesets.'''
# Figure out if a --parent version was given or not.
backout_to_parent = kwargs['opts'].get( 'parent', None )
# If no parent version was given, proceed.
if backout_to_parent is '':
return False
# Otherwise abort the operation.
from mercurial import util
raise util.Abort( 'Backout of a merge changeset is not allowed.' )
你可以在 .hgrc 或 Mercurial.ini 中配置这个钩子:
[hooks]
pre-backout.ttd_prevent_backout_merge = python:PATH_TO_HOOK_SCRIPT:prebackout_prevent_backout_merge