如何在 mercurial 中通过命令行获取所有关闭的分支?

How to get all closed branches via command line in mercurial?

在命令行中,我可以通过以下方式获取所有没有闭合分支的头:

hg heads

我还可以通过以下方式获得所有具有封闭分支的头:

hg heads --closed

但是,我如何通过命令行知道所有关闭的分支?

RTM hg help revsets

hg log -r "closed()"

样本:

>hg heads -T "{rev}:{node|short}\n"
9:caaade505e23
5:0c0ceaa4a8d2
3:3c58290b241d
1:99f7ad94a56f

>hg heads -c -T "{rev}:{node|short}\n"
10:fc7ddfb862bd
9:caaade505e23
5:0c0ceaa4a8d2
3:3c58290b241d
1:99f7ad94a56f

>hg log -r "closed()" -T "{rev}:{node|short}\n"
10:fc7ddfb862bd

所有封闭头的分支名称(主要用于命名分支)

hg log -r "closed()" -T "{branch}\n"

如果您只对名称或 md5 感兴趣,您可以使用:

hg branches --closed | grep '(closed)'

hg branches --closed命令显示所有分支,关闭的分支在行尾标有(closed)

default                     3478:154d6861fb79
regression_plugins          3415:f2e42c49b8cf
wg2                         2531:a4b3ac405ea3
qt_gui_hack                 2289:6505224a780b
github_notice              39240:8808397a6c66 (closed)
bump_9.13                  39230:e2f33b5a9364 (closed)
visual_offset_bbox         39209:6565274172c6 (closed)
remove_x11                 39207:ba78ef512346 (closed)

因此您可以使用 grep 将其缩小到仅关闭的分支:hg branches --closed | grep '(closed)$':

github_notice              39240:8808397a6c66 (closed)
bump_9.13                  39230:e2f33b5a9364 (closed)
visual_offset_bbox         39209:6565274172c6 (closed)
remove_x11                 39207:ba78ef512346 (closed)

现在,如果您只需要分支名称,可以使用 awk 去除变更集信息:

hg branches --closed | grep '(closed)$' | awk '{ print ; }'

github_notice
bump_9.13
visual_offset_bbox
remove_x11

请注意,如果您的 hg 存储库在分支名称中使用空格,则需要格外小心。 (我不知道他们为什么允许这样做;git 不允许这样做。)

在这一点上,其他推荐 hg log -r 'closed()' --template '{branch}\n' 的答案相比之下看起来优雅得多,但在某些边缘情况下此命令是错误的。此命令打印任何曾经关闭的分支的名称,但 mercurial 允许通过再次提交来重新打开分支。所以这会错误地将重新打开的分支识别为仍然关闭(因为它正在检查所有提交,而不仅仅是分支的头部)。

啊哈!您可能会说,让我们使用 hg log -r 'closed() and head()' --template '{branch}\n' 来仅打印具有闭合头部的分支名称。这当然可以解决问题,而且它比通过管道传输到 grep 和 sed/awk 更干净!但是 mercurial 分支可以有多个头,如果至少有一个头是开放的,则认为它是开放的。如果分支有任何封闭的头,即使它也有开放的头,此命令将声明分支关闭。

我在将一个庞大而复杂的 Mercurial 存储库迁移到 git 并尝试删除所有已关闭的分支时以艰难的方式学到了这一点。我的脚本一直在删除没有关闭的分支,那是我发现这些边缘情况的时候。