BLOG

Subversion でシンボリックリンクのような外部参照を利用する

Created at:
Category: development

ソースコードのバージョン管理には Subversion を用いている。

Subversion と比べて優れたものもあるらしいし、私自身も GitHub で git を使うこともある。 しかし、ここまで慣れてしまうと他のツールに変えようという気にはならない。大きな問題が起きた時には考えるだろうけど。

で、Subversion を使っていて、めったに使わないために忘れてしまう外部参照のやりかたをメモっておこうと思う。 外部参照を利用すると、シンボリックリンクのように扱われ、同じファイルを二箇所で管理するような無駄な事にはならない。

外部参照を利用するには、propset (または propedit) サブコマンドを用いて svn:externals プロパティを設定する。 例えば、カレントディレクトリ(ワーキングコピーの任意の場所)で、 svn://example.com/svn/hogehoge/trunk/fugafuga というリポジトリ上の特定のディレクトリを外部参照したい場合は、以下のように実行する。

svn propset svn:externals "svn://example.com/svn/hogehoge/trunk/fugafuga/ fugafuga" .

今回はディレクトリを指定しているが、ファイル単位での指定も Subversion 1.6 以降可能になったらしい。意識していなかったので知らなかった。

外部参照プロパティを設定した後は、次のコマンドを実行することでワーキングコピーに展開される

$ svn status
M .
$ svn commit -m '外部参照のテスト'
送信しています .

Committed revision 6.
$ svn update
Updating '.':

Fetching external item into 'fugafuga':
A fugafuga/aaa.c
A fugafuga/aaa.h
外部項目をリビジョン 92 に更新しました。

リビジョン 6 です。
$ ls
fugafuga
$

リポジトリへの外部参照は、以下のように色々な指定ができるようになっている。

他にもあるみたいだがよくわからなかった。絶対パスも使えるし、困ったときにまた調べることにしよう。

あと、リビジョン指定もできる。

svn propset svn:externals "svn://example.com/svn/hogehoge/trunk/fugafuga/@11 fugafuga" .

(@ による指定)とか、

svn propset svn:externals "-r 15 svn://example.com/svn/hogehoge/trunk/fugafuga/ fugafuga" .

(-r オプションによる指定)といった感じ。

最後に面白いと思ったのが、# 文字の使用だ。値の行頭に ‘#’ 文字をつけるとコメントとして扱われる。

$ svn propget svn:externals .
#-r 15 svn://example.com/svn/hogehoge/trunk/fugafuga/ fugafuga

$

この状態で、svn update を実行すると、fugafuga が消えてしまう(外部参照がなくなる)のだ。

$ svn update
Updating '.':
Removed external 'fugafuga'
リビジョン 7 に更新しました。
$