你可以关闭Mercurial分支而不先更新吗?

时间:2014-04-16 23:46:29

标签: mercurial branch

我知道您可以通过以下方式关闭Mercurial分支:

hg update rev-number
hg commit --close-branch -m "Closing branch."

然而,我使用的一些存储库相当大,并且在发现多年前我想要关闭的松散分支之后,首先更新它可能需要很多分钟(如果不是几小时),只做一次提交然后更新回我正在处理的原始版本(更多分钟,如果不是几小时)。

所以我的问题是,有没有办法关闭Mercurial分支而不先将工作目录更新到分支修订版?

3 个答案:

答案 0 :(得分:40)

是的,你可以,但这在任何地方都没有记录。我已经使用了这种技术很长时间了,不用担心,这是安全的。

您可以发出以下命令

,而不是更新
hg debugsetparent <revision>
hg branch <branchOfRevision>

请注意,订单很重要。这将使您的repo认为它在新版本上,而您的所有文件都来自最初的版本。之后,您可以使用--close-branch提交,但使用-X *选项进行空提交。

hg commit --close-branch -X * -m "Closing branch."

现在,只需回到你以前的头脑,就像什么也没发生一样。

hg debugsetparent <InitialRevision>
hg branch <branchOfInitialRevision>

最后,如果您有子回购,则可能需要在提交.hgsub之前临时重命名--close-branch文件,然后重命名。

答案 1 :(得分:4)

Mercurial 4.8及更高版本随附了具有以下功能的核心扩展 closehead

hg close-head <revision>

从帮助中:

  

这等同于在干净的树中签出每个修订并运行“ hg commit --close-branch”,只是它不会更改工作目录。

目前,您需要在[HGRC][]中明确启用此扩展名:

[extensions]
closehead =

答案 2 :(得分:1)

感谢Vince的方法。我已经将它实现为一个Python脚本 - 它比我最初预期的要多一些,所以希望这会为其他人节省一些时间。使用TortoiseHg 3.3和Python 2.7.9在Windows 8.1上测试。

欢迎反馈,它可能会有一些技巧,特别是在错误处理方面。

#!/usr/bin/python

from subprocess import check_output

def close_branch( branch, message ):
    if not message:
        message = 'Closing branch "{}"'.format( branch )
    print( 'Closing branch "{}"'.format( branch ) )
    try:
        check_output( 'hg debugsetparent ' + branch )
        check_output( 'hg branch ' + branch )
        check_output( 'hg commit --close-branch -X * -m "' + message + '"' )
    except:
        print( 'Failed to close branch.' )

def main():
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('branch', help='branch name(s)', nargs = '+' )
    parser.add_argument('-m', '--message', help='message (defaults to "Closing branch <branch name>")' )
    args = parser.parse_args()

    status = check_output( 'hg status' )
    if len(status) > 0:
        print( 'Do not use this script with local changes. Commit/revert changes and try again' )
        exit(1)

    # Cache initial revision and branch.
    initial_revision = check_output( 'hg id -i -b' ).split()
    # print( 'Using: ' + initial_revision[0].decode("utf-8") )

    for branch in args.branch:
        close_branch( branch, args.message )

    # Return to original changeset
    check_output( 'hg debugsetparent ' + initial_revision[0].decode("utf-8") )
    check_output( 'hg branch ' + initial_revision[1].decode("utf-8") )

if __name__ == '__main__':
    main()