Mercurial扩展或钩子,以防止合并变更集的退出

时间:2014-01-24 21:12:17

标签: mercurial merge backout

作为noted in the documentationhg backout命令在与合并变更集一起使用时可能会导致问题。最近我们遇到了一些新的开发人员退出合并变更集并导致我们希望在所有内容重新合并时保留的代码。

为了避免这种情况,我试图想出一个防止这种情况发生的好方法。有没有一个很好的通用方法我可以写一个钩子或只是完全禁用退出命令?

(我们的标准开发人员设置的一部分是安装一组自定义扩展,所以我已经有一个很好的方法在本地为我们的整个开发团队安装这些类型的规则 - 我只是没有想到一个好的方法实现规则集。)

2 个答案:

答案 0 :(得分:1)

这个怎么样:

$ 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 hook(for * 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 logwc来计算相关修订的父母数量。如果有多个父级,则为合并。

尽管如此,我强烈建议您使用最近的Mercurial:查看release notes以了解您缺少的令人兴奋的功能。

答案 1 :(得分:1)

这是一个简单的基于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