我知道您可以通过以下方式关闭Mercurial分支:
hg update rev-number
hg commit --close-branch -m "Closing branch."
然而,我使用的一些存储库相当大,并且在发现多年前我想要关闭的松散分支之后,首先更新它可能需要很多分钟(如果不是几小时),只做一次提交然后更新回我正在处理的原始版本(更多分钟,如果不是几小时)。
所以我的问题是,有没有办法关闭Mercurial分支而不先将工作目录更新到分支修订版?
答案 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()