時には、たくさんの異なるチェックアウトから作業コピーを構成するのは、便利なことがあります。たとえば、リポジトリ内の異なる場所もしくは異なるリポジトリにある、異なるサブディレクトリが必要になるかもしれません。全てのユーザーが同じレイアウトを保持するには、svn:externals
プロパティを設定し、必要なところから指定したリソースを取得します。
さて、ここで/project1
の作業コピーをD:\dev\project1
にチェックアウトとするとしましょう。D:\dev\project1
フォルダーを選択して右クリックし、コンテキストメニューから → を選択します。プロパティダイアログが表示されます。次に Subversion タブに移動すると、プロパティを設定することができます。 をクリックして表示されるダイアログで、svn:externals
が既に存在すればそれをダブルクリックし、そうでなければ ボタンを押し、メニューからsvn:externals
を選択します。新たな外部項目を追加するには、 ボタンをクリックしてから、表示されるダイアログで必要な情報を入力します。
正しく動作させるためには、URLを適切にエスケープする必要があります。例えば、空白文字は%20
に置き換えなければなりません。
ローカルのパスに空白や特殊文字を使用したい場合、二重引用符で囲ったり、Unix シェル形式のエスケープ文字 \
(バックスラッシュ) を特殊文字の前に置いてください。もちろんこれは、パス区切り文字に /
(スラッシュ)を使わなければならない、ということでもあります。この挙動は Subversion 1.6 の新機能で、それ以前のクライアントでは動作しないことに注意してください。
上に示したように、すべての外部参照の定義において、リビジョン番号を指定することを強くお勧めします。そうすれば、別なバージョンの外部の情報を取り出すとき、どれを取り出すか正しく特定できます。常識的にはコントロールが利かないサードパーティーのリポジトリに変更があっても驚かされなくなるという面もありますが、リビジョン番号を指定するということは、作業コピーを以前のリビジョンに戻す場合、外部参照の定義もそのリビジョンが参照していた時のものに戻るということで、つまりリポジトリの古いリビジョンに切り替えれば、外部参照がその時点で作業コピーが参照していたリビジョンに更新されるということです。ソフトウェアのプロジェクトにおいて、これは古い複雑なコードベースで過去のスナップショットの構築に成功するか失敗するかの分かれ目になります。
svn:externals
プロパティの編集ダイアログでは外部参照を選択できますが、明示的に最新リビジョンが選択されます。
外部プロジェクトが同じリポジトリにある場合、メインプロジェクトの変更をコミットすると、変更がコミットリストに含まれます。
外部プロジェクトが別のリポジトリにある場合、メインプロジェクトのコミット時に、外部プロジェクトに対する変更は通知されますが、別々にコミットする必要があります。
svn:externals
の定義に絶対 URL を使用し、作業コピーを再配置しなければならない(つまり、リポジトリの URL を変更する)場合、外部参照は変化せず、もう動作しないかも知れません。
このような問題を避けるため、Subversion クライアントバージョン 1.5 以降では、相対外部参照 URL をサポートします。相対 URL を指定する4つの異なる方法をサポートしています。以下の例では、2つのリポジトリ(http://example.com/svn/repos-1
と http://example.com/svn/repos-2
)があると仮定します。C:\Working
に http://example.com/svn/repos-1/project/trunk
のチェックアウトがあり、トランクに svn:externals
プロパティをセットしています。
この URL は、以下の例のように、常に ../
という文字列で始まります。
../../widgets/foo common/foo-widget
これは、C:\Working\common\foo-widget
へ http://example.com/svn/repos-1/widgets/foo
を抽出します。
URL が、ディスクに書かれている外部参照のディレクトリではなく、svn:externals
プロパティにあるディレクトリの URL への相対パスであることに注意してください。
この URL は、以下の例のように、常に ^/
という文字列で始まります。
^/widgets/foo common/foo-widget
これは、C:\Working\common\foo-widget
へ http://example.com/svn/repos-1/widgets/foo
を抽出します。
同じ SVNParentPath
(複数のリポジトリを保持する共通ディレクトリ) にある他のリポジトリに、容易に参照できます。例は以下のようになります。
^/../repos-2/hammers/claw common/claw-hammer
これは、C:\Working\common\claw-hammer
へ http://example.com/svn/repos-2/hammers/claw
を抽出します。
//
で始まる URL は URL のスキーム部のみをコピーします。これは同じホスト名に対して、ネットワークの場所によって異なるスキームでアクセスしなければならない場合に便利です。例えば、インターネットにあるクライアントは http://
を使用するのに、外部クライアントは svn+ssh://
を使用するということです。以下に例を挙げます。
//example.com/svn/repos-1/widgets/foo common/foo-widget
これは、C:\Working
をチェックアウトするのに使用した方法により、http://example.com/svn/repos-1/widgets/foo
か svn+ssh://example.com/svn/repos-1/widgets/foo
を抽出します。
/
で始まる URL は URL のスキーム部とホスト名部をコピーします。以下に例を挙げます。
/svn/repos-1/widgets/foo common/foo-widget
これは C:\Working\common\foo-widget
に http://example.com/svn/repos-1/widgets/foo
を抽出します。しかし、svn+ssh://another.mirror.net/svn/repos-1/project1/trunk
というように別のサーバーから作業コピーをチェックアウトすると、外部参照は svn+ssh://another.mirror.net/svn/repos-1/widgets/foo
を抽出します。
必要に応じて、URLに対してペグリビジョンや操作対象リビジョンを設定することができます。ペグリビジョンや操作対象リビジョンについて詳しいことは、 Subversion book の corresponding chapter をご覧ください。
If you specify the target folder for the external as a subfolder like in the examples above, make sure that all folders in between are versioned as well. So for the examples above, the folder common
should be versioned!
While the external will work in most situations properly if folders in between are not versioned, there are some operations that won't work as you expect. And the status overlay icons in explorer will also not show the correct status.
TortoiseSVN がプロパティをどのように扱うかについての詳細な情報は、 「プロジェクト設定」 を参照してください。
共通サブプロジェクトへの他のアクセス方法については、 「共通のサブプロジェクトを含める」 を参照してください。
Subversion 1.6 では、フォルダーと同じ文法を用いて、単一ファイルの外部項目を作業コピーに追加できます。しかし、いくつか制限事項があります。
外部参照ファイルへのパスは、svn:externals
プロパティで設定したフォルダーの直下の子でなければなりません。
外部ファイルの URL が、外部ファイルを挿入する URL と同じリポジトリになければなりません。つまり、リポジトリ間の外部ファイルはサポートしていません。
外部ファイルの挙動は、あらゆる点でその他のバージョン管理下のファイルと同等ですが、通常のコマンドでは、移動・削除ができません。代わりに svn:externals
プロパティを変更しなければなりません。