リポジトリのフォルダ構成を考えるときに、ライブラリやOS部分を自分の管理するソースの近くにおいておきたい、だけどもリポジトリで管理はしたくない。というときがある。 そんな時はチェックアウト時に自動で他のリポジトリからフォルダやファイルを引っ張ってくる、「外部参照」機能を使ってみてはどうでしょうか。
環境
Windows 10
Suvbersion
TortoiseSVN
Git(参考)
外部参照機能
リポジトリにあるアプリケーションをチェックアウトするときに、自動で他のリポジトリからファイルやフォルダを取得する機能。
Subversionには標準で外部参照の機能があり、結構便利につかえる。
手順(コマンド)
外部参照したファイル/フォルダを置きたい場所に移動
sh cd ~/myworkspace
外部参照を追加
sh svn propset svn:externals 'LibDir http://svn.util/libs' .
LibDir : 作成されるディレクトリ名
http://svn.util/libs : 参照元のリポジトリURL
. : 外部参照プロパティを設定する場所。1. で移動したフォルダに設定している。設定の確認
sh svn proplist -v
手順(TortoiseSVN)
外部参照したファイル/フォルダを置きたい場所を右クリック→属性(Properties)を選択
新規(New)をクリック
属性名(Property name)にsvn:externalsを指定し、以下のように外部参照を追加する
外部参照の問題点
問題点というより完全に良し悪しですが、外部参照したフォルダ/ファイルはチェックアウト後と同等の扱いを受ける。つまり変更をコミットできてしまう。
リポジトリを分けて別管理にしていたはずなのに、一度チェックアウトしてしまえば区別無く扱えてしまう。
リポジトリとのリンクを切る方法がないか調べたが、Subversionの機能にはなかった。
外部参照ではなく外部からコピーをする
svn:exportするバッチで解決した。
- コピーを取得したいフォルダに移動
exportするバッチを作成しコミット
sh svn export http://svn.util/libs
- チェックアウトし、手動でバッチを起動しexportを完了する
もっといい方法が欲しい・・・。
Gitの場合
Gitにも外部参照を実現するsubmoduleという機能があるよう。
submoduleを設定
sh git submodule add http://svn.util/libs LibDir
設定を確認
sh git status
- commitとpushを行い設定を反映
こちらもあくまで参照で、コピーではないもよう。
おわりに
別チームで1つのものを作っている、加えて別々のリポジトリを持っている。と言った場合には、この様にお互いのリポジトリを紐付けられるととても便利。