更好的 hg 字符串转义

更好的 hg 字符串转义

因此,我会定期删除版本控制系统 hg 列出的缺失文件。我注意到的是,我的这个(诚然丑陋的)脚本没有正确转义字符串:

hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove

它在很多情况下都有效,但一些奇怪的字符串会recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf导致它损坏。顺便说一句,hg 告诉我这些字符串不是“Windows 安全的”……不管这是什么意思。

有人可以找到更好的方法来删除 hg 列出为“!”的文件吗?或失踪?

答案1

我用:

hg addremove

为了那个原因在我从签出目录中删除任何残骸之后(或者在我向文件添加模式之后.hgignore)。
hg addremove -h告诉你:

Add all new files and remove all missing files from the repository.

Mercurial 抱怨*文件名中的 。这是一个保留字符,不能在 Windows 上的文件名中使用。然而,该消息本身不会stderr影响管道的功能。

另一种方法是使用:

hg remove --after

它标记已删除的文件,但对所有文件(仍然存在的文件和已删除的文件)进行评论,并且似乎对该--quiet选项没有反应。

答案2

xargs看到\!\(\*-4.pdf它的输入时,它就理解了!(*-4.pdf。如果您使用xargs,则需要生成与其输入语法相匹配的输入,这与其他任何内容不同。仅在空格前添加反斜杠只能处理空格。

在 Linux、*BSD 和 OSX 上,xargs支持选项-0,该选项告诉它对由空字节分隔且不带引号的记录进行操作。hg status -0生成由空字节分隔的记录。剩下的就是调整中间处理来处理空值而不是换行符作为分隔符。

使用 GNU awk 或任何其他支持空字节作为记录分隔符的 awk(我认为 BSD/OSX awk 可以),您可以将转换切换到 awk。

hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove

相关内容