【问题标题】:Mercurial extension or hook to prevent backout of merge changesetsMercurial 扩展或挂钩,以防止退出合并变更集
【发布时间】:2014-01-24 21:12:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: mercurial merge backout


    【解决方案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 钩子(用于 *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 以了解您缺少的令人兴奋的功能。

    【讨论】:

    • 不幸的是,从 Mercurial 2.8 开始,仍然可以使用 --parent 选项取消合并(它被标记为已弃用,但仍然有效)。 TortoiseHg 中的对话框也“帮助”了它,它只要求您选择父母。我需要我的解决方案才能在 Windows 上工作,但我会看看我是否可以做类似你的钩子的事情。
    • Oben -- 感谢您的帮助。我不知道预退出挂钩。我已经发布了我想出的答案作为接受的答案,但是奖励了你,因为你的帮助是让我走上正轨的原因。
    • 很公平。很高兴我能帮上忙。我不知道--parent 选项,感谢您指出这一点。
    【解决方案2】:

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

    【讨论】:

    • 这个 Python 版本绝对是你钩子的更好(和更便携)的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多