如何在 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 并尝试删除所有已关闭的分支时以艰难的方式学到了这一点。我的脚本一直在删除没有关闭的分支,那是我发现这些边缘情况的时候。
在命令行中,我可以通过以下方式获取所有没有闭合分支的头:
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 并尝试删除所有已关闭的分支时以艰难的方式学到了这一点。我的脚本一直在删除没有关闭的分支,那是我发现这些边缘情况的时候。