从 Mercurial 仓库中删除所有本地书签

Remove all local bookmarks from Mercurial repo

hg bookmarks --delete 可用于删除书签。

有什么方法可以通过某些 bash 脚本删除 Mercurial 存储库中的所有书签吗?我认为这可能可以使用 awk - 但它有点超出我的范围。

hg bookmarks输出的格式是(例如):

2018.02.706 Customer App 5255:c1321f7f3903
2018.02.707 Customer App 5255:c1321f7f3902

我只需要:

2018.02.706 Customer App
2018.02.707 Customer App

这应该删除最后一个字段:

awk 'NF{NF--}1' file

这只是将最后一个字段设置为空:

awk '{$NF=""}1' file
awk 'sub($NF,"")' file

2018.02.706 Customer App 

2018.02.707 Customer App

考虑到之前回复的帮助,这里是我用来删除 mercurial 书签的完整脚本:

hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{print "hg bookmarks --delete 7" [=10=] "7"}' > clear-bookmarks.sh

如果要确保删除前导空格和尾随空格,请使用以下内容:

hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }' | awk '{print "hg bookmarks --delete 7" [=11=] "7"}' > clear-bookmarks.sh

我的脚本编写经验无论如何都算不上出色 - 但它似乎可以胜任!

假设您输入的 space 是空白字符,因为它出现在您的示例输入中,要以可移植和稳健的方式执行您在问题中要求的操作是:

$ sed 's/ [^ ]*$//' file
2018.02.706 Customer App
2018.02.707 Customer App

中的命令行将产生的输出是:

$ sed 's/\(.*\) .*$/hg bookmarks --delete '\'''\''/' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'

如果您对使用 awk 有强烈的渴望,那么它会是:

$ awk '{sub(/ [^ ]+$/,"")}1' file
2018.02.706 Customer App
2018.02.707 Customer App

$ awk '{sub(/ [^ ]+$/,""); print "hg bookmarks --delete 7" [=12=] "7"}' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'

如果您示例中的白色 space 可以不是单个空白字符,则将 / [^ ]+$/ 替换为 /[[:space:]]+[^[:space:]]+$/

我认为 this solution(有一些 可能 需要更正)会比 awk-ing 更容易和更自然:纯 Mercurial,仅此而已

如果您真的只想删除所有书签,只需从存储库的隐藏 .hg 目录中删除 .hg/bookmarks 文件即可。

如果您从远程位置提取书签,书签可能会恢复,因此您还必须执行 hg book push -B 'your bookmark name' 以从远程位置删除书签,但这是您将面临的问题使用任何其他删除书签的方法。