svn の外部定義 externals を使ってみた

svn externals を使ったことがなかったので、使ってみました。

環境

OS MacOS X 10.6.6
Subversion 1.6.5

実験環境構築

ローカルにHogeとFugaという2つリポジトリを作って、HogeからFugaを外部定義してチェックアウト出来るようにします。

## リポジトリを作り、ファイルをコミットします
## Hogeリポジトリの作成
% svnadmin create ~/Hoge
% mkdir ~/work
% cd ~/work
% echo "test externals" > README
% svn import -m "test commit" file:///Users/japanrock/Hoge/
追加しています              README
リビジョン 1 をコミットしました。

## Fugaリポジトリの作成
% svnadmin create ~/Fuga
% mkdir ~/work2
% cd ~/work2
% echo "test externals fugafuga" > README
% svn import -m "test commit fuga" file:///Users/japanrock/Fuga/
追加しています              README
リビジョン 1 をコミットしました。

Hogeをチェックアウトして、Fugaをexternalsする

## Hogeをチェックアウト
% mkdir ~/work3
% cd ~/work3
% svn checkout file:///Users/japanrock/Hoge/ hoge
A    hoge/README
リビジョン 1 をチェックアウトしました
% cd hoge

## 外部定義
% svn propset svn:externals 'test_fuga file:///Users/japanrock/Fuga' .
属性 'svn:externals''.' に設定しました

## 設定の確認
% svn proplist -v
'.' の属性:
  svn:externals
    test_fuga file:///Users/japanrock/Fuga

## Fugaを外部項目として取得する
% svn up

外部項目を 'test_fuga' に取得しています
A    test_fuga/README
外部項目をリビジョン 1 に更新しました。

リビジョン 1 に更新しました。

## Fugaリポジトリが test_fugaディレクトリにチェックアウトされたことを確認
% ls -la
total 8
drwxr-xr-x  5 japanrock  staff  170  2  8 22:22 .
drwxr-xr-x  3 japanrock  staff  102  2  8 22:21 ..
drwxr-xr-x  8 japanrock  staff  272  2  8 22:22 .svn
-rw-r--r--  1 japanrock  staff   15  2  8 22:21 README
drwxr-xr-x  4 japanrock  staff  136  2  8 22:22 test_fuga
% cat README
test externals
% cat test_fuga/README
test externals fugafuga

Hoge から外部項目Fugaを削除する

% svn propdel svn:externals .
属性 'svn:externals''.' から削除しました

## 削除されたことを確認
% svn proplist -v
% 

## svn upで Fugaがチェックアウトされないことを確認
% svn up
リビジョン 1 です
% 

## 外部項目は削除したけど、test_fugaディレクトリは削除されずに残る・・・
% ls
README		test_fuga

## しかたないので、rm -fr で削除
% rm -fr test_fuga
% ls
README

チェックアウトされないのは良いのだけど、一度チェックアウトされた Fuga はローカルに残っている。これは、rm で削除するしかないのか・・・。外部項目削除したら、一緒にローカルも消えてくれるといいのに・・・。

追記

エディタを使って外部定義を編集できます。 参考

外部定義している箇所を全てリストアップ

svn propget svn:externals --recursive * 

エディタを使って、svn:extrnals を編集(例)

svn propedit svn:externals ./vendor/plugins/