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.txt、fuga.txt があった場合、上記コマンドでは最終的には

rm -rf hoge.txt fuga.txt

となります。

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

普通は上記のワンライナーで問題ないと思います。が、管理外のファイルが大量にある場合は下記のようなエラーが発生することがあります。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.txt
rm -rf fuga.txt

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

無視リスト global-ignores の注意点

上記の方法でSubversionの管理外のファイルを綺麗さっぱり削除できます……と言いたいところですが、1つ注意点があります。
「無視リスト」の存在です。ある拡張子を持つファイルはデフォルトではSubversionに無視される設定になっています
デフォルトでは下記のものが無視リストに設定されているはずです。*.o ファイルをうっかりコミットすることもないのはこの無視リストのおかげです。

# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo

もし .o ファイルを生成するようなビルドをしている場合、管理外ファイルを削除するだけでは.oファイルは削除されません。
そこで、無視リストのファイルも削除するには下記のようにします。svn status に –no-ignore コマンドをつけると ignore 属性のファイルも表示されます。

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

TortoiseSVN の場合は下記のように「無視するファイルやフォルダーを削除」にもチェックを入れてください(下記の例は英語版ですが日本語設定でも同じです)。

これで無視リストに含まれた Subversion 管理外のファイルを削除できます!

まとめ

今回は Subversion の管理外のファイルを削除する方法についてみてきました。TortoiseSVN が使える環境なら、右クリックからクリーンアップでOKです。GNU/Linuxなどではコマンドラインから実行する必要があります。

管理外ファイルを片っ端から消したい場合は下記のコマンドで OK です。

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

ただし、無視リストに登録されているファイルは消したくない場合は下記のようにします。

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

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