Subversion の管理外の大量のファイルを削除する|Argument list too long と怒られても大丈夫!

どうも、ながやすです。
最近のコード管理は git が流行りですが、仕事で使うのは枯れている Subversion だという方も多いと思います。今回はその Subversion で、管理外のファイルをコマンドラインにて削除する方法を示します。

スポンサーリンク

TortoiseSVN の場合

Windows では、GUI で操作できる TortoiseSVN を使っている方が多いと思います。TortoiseSVNにて管理外のファイルを削除する方法は簡単です。右クリックから「クリーンアップ」を選択して、「バージョン管理外のファイルやフォルダーを削除」にチェクを入れて削除するだけです。下記の画像は英語ですが、日本語でも同じです。赤の傍線のところにチェックを入れて実行するだけです。楽勝ですね。特に悩むところはないかと思います。

TortoiseSVNのクリーンアップの詳細は下記のサイトで確認してみてください。

コマンドラインの場合

GNU/Linuxなどでは、コマンドラインからバージョン管理外のファイルやフォルダーを削除するために自分でコマンドを打つ必要があるあます。といっても、ワンライナーで一発ですけどもね。

ググってみたところ、下記のコマンドが一般的なようです。svn status を実行すると、Subversion 管理以外のファイルは行頭に「?」をつけて表示されます。それを利用してワンライナーで、それらをどーんと削除するコマンドですね。xargs がコツです。

svn status | grep ^? | cut -c9- | xargs -t rm -rf

例えば管理外ファイルとして hoge.o、fuga.o があった場合、上記コマンドでは最終的には

rm -rf hoge.o fuga.o

となります。

管理外のファイルが多すぎてエラーになる場合

普通は上記のワンライナーで問題ないと思います。が、管理外のファイルが大量にある場合は下記のようなエラーが発生することがあります。rm に渡すファイルが多すぎて rm が困ってしまう場合ですね。

unable to execute /bin/rm: Argument list too long

対策としては、rm に渡すファイルを減らすことです。find や grep を駆使する方法も考えられますが、ここではxargsの並列処理機能を利用してみます。 -Iオプションと -P オプションを使います。下記のようなワンライナーになります。

svn status | grep ^? | cut -c9- | xargs -t -I{} -P 0 rm -rf {}

こうすると、rm がパラレルで実行されます。イメージとしては、下記のようにそれぞれの管理外ファイルが並列に削除されます。

rm -rf hoge.o
rm -rf fuga.o

各ファイルごとに rm コマンドが実行されますので、rm に渡すファイルが多すぎるというような事態を回避できます。また、並列に処理を行うので、最近のマルチコアな環境では速度も特に問題になりません。もし巨大なプロジェクトを Subversion で管理するときは、管理外のファイルを削除するときはこちらのxargsで削除してみることをお勧めいたします。

まとめ

今回は Subversion の管理外のファイルを削除する方法についてみてきました。TortoiseSVN が使える環境なら、右クリックからクリーンアップでOKです。GNU/Linuxなどではコマンドラインから実行する必要があります。このとき、比較的小規模なら svn status | grep ^? | cut -c9- | xargs -t rm -rfで大丈夫です。

ただ、ある程度大規模なプロジェクトですと、管理外ファイル数が多すぎてrm コマンドが処理できない場合があります。そのときは xargsの並列処理を利用して
svn status | grep ^? | cut -c9- | xargs -t -I{} -P 0 rm -rf {} とすればOKです!

環境によっていい感じに使い分けてください!!