お仕事で、構成管理にあたっているチームの方からSubversionの「外部項目」について相談をうけて対応したときのお話の紹介です。
外部項目とは?
私がお仕事で関わっているSubversionリポジトリでは、わずかではありますが、「外部項目」(externals)の機能を利用しています。
外部項目は、Subversionリポジトリの任意のパスに配置できる一種の「ショートカット」で、同一ないし別のSubversionリポジトリのパスを参照することを可能にする機能です。
外部項目を含むディレクトリをチェックアウトすれば、外部項目が参照するパスのファイルもいっしょにチェックアウトされます。
同一リポジトリであれば、外部項目によりチェックアウトされた項目に対する変更は、参照先のパスに反映されます。
このように便利な機能ですが、Subversionで管理されるファイルセットに単なるツリー構造以上の構造(関係性)を導入することになるため、挙動の理解や管理作業が少し複雑になります。
相談内容
構成管理にあたっているチームから相談を受けた内容はおおよそ以下の通り:
- 運用ルールの変更に伴いSubversionリポジトリ内のとあるディレクトリ(A)を削除した
- 当該ディレクトリ(A)は同一リポジトリの別ディレクトリ(B)に含まれる外部項目により参照されていた
- 後者のディレクトリ(B)をチェックアウトしたり更新したりするとエラーが発生するようになってしまった
- 一旦参照先のディレクトリ(A)を復元するとエラーはなくなった
- Subversionの作業コピーやリポジトリブラウザー上で外部項目に対して「削除」を行うと参照先は削除されるが外部項目は残る
- この状態でディレクトリ(B)をチェックアウトしたり更新したりするとエラーが発生する
→エラー発生させることなく外部項目を削除したい。
作業内容
この相談を受けて私が行った作業はおおよそ以下の通り:
①外部項目の含まれるディレクトリを手元にチェックアウト
②コマンドプロンプトを起動
③先程チェックアウトした作業コピーディレクトリにカレントディレクトリを移動
④ svn proplist -v
で外部項目の存在を確認(ある)
出力例:
Properties on '.':
svn:externals
(参照先パス) (外部項目名)
⑤ svn propdel svn:externals .
で外部項目の削除を実施
出力例:
property 'svn:externals' deleted from '.'.
⑥ svn proplist -v
で外部項目の存在を確認(ない)
⑦外部項目のディレクトリは(ファイルシステム上は)そのまま残るので rmdir /S /Q (外部項目フォルダ名)
で削除
⑧作業コピーにおける変更をSVNコミット
外部項目は、作業コピーの置かれたファイルシステムのディレクトリ(フォルダ)としての実体と、Subversionが管理する親ディレクトリ(前述「相談内容」でいえばBの方)のプロパティとしての実体と、2つの実体を持っています。
今回の作業で肝となるのは後者、プロパティの削除です。削除しなくてはならないプロパティは、外部項目を表すディレクトリそのものではなく、その親ディレクトリであるという点も少しわかりにくく感じるところですね。
以上、分かれば大したことはないのですが、分かるまでに少し四苦八苦するお話でした。