因此,我会定期删除版本控制系统 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