![更好的 hg 字串轉義](https://rvso.com/image/31684/%E6%9B%B4%E5%A5%BD%E7%9A%84%20hg%20%E5%AD%97%E4%B8%B2%E8%BD%89%E7%BE%A9.png)
因此,我會定期刪除版本控制系統 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