読者です 読者をやめる 読者になる 読者になる

Subversionで特定のディレクトリ以下の更新を無視する方法

subversion

Subversionリポジトリの一部をチェックアウトできる。ブランチやタグをコピーで実現する以上必須の機能で、昨今の分散型には見られない便利な特徴でもある。
それはそれとして、逆のことをしたいと思ったことはないだろうか。つまり、作業ディレクトリの特定のディレクトリ以下を無視したい。
追加や状態確認時に無視するのなら svn:ignore を使えばいい。そうではなくて、リポジトリには存在するけど個人的に用がなくてそこは見たくない場合。巨大なファイルがあったり、用もないのに頻繁に更新される場所は無視したいだろう。
そのやり方を紹介。

無視する

TortoiseSVN

無視したいディレクトリを右クリックして、TortoiseSVN → 特定のリビジョンへ更新(U) ... → 「更新の深さ」で「除外」を指定して OK

svn
$ svn update --set-depth exclude path

以上の操作で、対象のディレクトリが消えて*1、以降の更新操作ではそのディレクトリは一切無視される。

元に戻す

TortoiseSVN

無視したディレクトリの親(どの階層でもいい)を右クリックして、TortoiseSVN → 特定のリビジョンへ更新(U) ... → 「更新の深さ」で「再帰的」を指定して OK

svn
$ svn update --set-depth infinity
もしくはパスが正確にわかっているなら
$ svn update path

なお、管理外のファイルが残っていたりして前のディレクトリが残っていると更新できないので注意。消してしまうか、必要なら一旦リネームしてから更新後に中身をコピーする。

細かい話

ちゃんとドキュメントを読んでないので憶測だけど、どうやら Subversion はディレクトリ毎に更新の深さを設定できるらしい。それを設定するのが svn update --set-depth で、以下のものが指定できる模様。

意味
exclude 対象ディレクトリを更新しない
empty 対象ディレクトリの中身を更新しない
files 対象ディレクトリの中にあるディレクトリを更新しない(ファイルのみ更新する)
immediates 対象ディレクトリ内のファイルとディレクトリは更新するが、対象ディレクトリ内のディレクトリの中身は更新しない
infinity 再帰的に全て更新する

更新の深さの情報がどこに保存されててどうすれば参照できるのかがよく分からなかったんだけど、どちらにしても場合によっては便利な機能なので、活用したいですね。

*1:管理外のファイルがあった場合は残る