したがって、バージョン管理システムhgに記載されている不足しているファイルを定期的に削除します。私が気づいたのは、私のスクリプトが文字列を適切にエスケープしていないことです。
hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove
多くの場合、うまくいきますが、いくつかの奇妙な文字列が動作を停止するrecognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf
可能性があります。ところで、hgはこの文字列が「Windowsの安全性」ではないと言います。
誰でも「!」とリストされているファイルを削除するより良い方法を見つけることができますか?それとも行方不明ですか?
答え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