0

ここで私の問題の最良の解決策を見つけます: Howto fix subversion «!» 状態

しかし今、私はそれを行うための小さなスクリプトを書きたいと思っています。

このような:

svn status | grep '\!' | awk '{print $2}' | xargs svn revert

svn status | grep '\!' | awk '{print $2}' | xargs svn delete

でも一行で。

svn revert の後、「svn status | grep '!'」は結果を返さないためです。合理的な。

私は解決策を見つけたと思います.xargsに渡されたデータを1行に2回入れますが、私は英語が少し苦手で、コマンドラインは得意ではありません.

4

2 に答える 2

1
svn status | grep '\!' | awk '{print $2}' | tee list.$$ | xargs svn revert
xargs svn delete < list.$$
rm list.$$

このteeコマンドは、T パイプ継手のようなものです。出力の 1 つのコピーが各名前付きファイルに送られ、別のコピーが標準出力に送られます。ここでは、ファイルを 1 つだけ指定しました。この名前list.$$は、スクリプトが他のプロセスのファイルを踏みにじるのを防ぐ簡単な方法です。mktempより安全で予測しにくい名前を作成するために使用できるようなプログラムがあります。OTOH、敵対的な環境で実行していない場合、問題になる可能性はほとんどありません. 本当に注意している場合はtrap、ファイルが確実にクリーンアップされるように を作成します。

tmp=${TMPDIR:-/tmp}/list.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15

svn status | grep '\!' | awk '{print $2}' | tee $tmp | xargs svn revert
xargs svn delete < $tmp

rm $tmp
trap 0

他にも試すことができるトリックはありますが、少なくともそれらのいくつかは、順次操作を保証しません。たとえば、次のプロセス置換bash:

svn status | grep '\!' | awk '{print $2}' | tee >(xargs svn revert) | xargs svn delete

各ファイルは元に戻されて削除されますが、順序は予測できません。

于 2012-09-22T12:19:14.073 に答える
1

両方のコマンドを 1 行に。xargs が完全に失われていることに注意してください。xargs が良くないというわけではありません。ここでは必要ないだけです。

x="$(svn status | grep '\!' | awk '{print $2}')"; svn revert "$x" && svn delete "$x" || echo "no svn delete $?"

svn revertが失敗した場合、 svn deleteは実行されないことに注意してください。「no svn delete」は、svn コマンドの 1 つが失敗したことを示します。

于 2012-09-22T15:09:16.417 に答える