時には、たくさんの異なるチェックアウトから作業コピーを構成するのは、便利なことがあります。たとえば、リポジトリ内の異なる場所もしくは異なるリポジトリにある、異なるサブディレクトリが必要になるかもしれません。全てのユーザーが同じレイアウトを保持するには、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 をご覧ください。
TortoiseSVN がプロパティをどのように扱うかについての詳細な情報は、 「プロジェクト設定」 を参照してください。
共通サブプロジェクトへの他のアクセス方法については、 「共通のサブプロジェクトを含める」 を参照してください。
Subversion 1.6 では、フォルダーと同じ文法を用いて、単一ファイルの外部項目を作業コピーに追加できます。しかし、いくつか制限事項があります。
外部ファイルへのパスは、既存のバージョン管理下にあるフォルダーにファイルを配置しなければなりません。一般的に、svn:externals
がセットされているフォルダーに、直接ファイルを配置するのがほとんどだと思いますが、バージョン管理下のサブフォルダーにすることもできます。対照的に、外部ディレクトリは、必要に応じてバージョン管理外の中間サブフォルダーを、自動的に作成します。
外部ファイルの URL が、外部ファイルを挿入する URL と同じリポジトリになければなりません。つまり、リポジトリ間の外部ファイルはサポートしていません。
外部ファイルの挙動は、あらゆる点でその他のバージョン管理下のファイルと同等ですが、通常のコマンドでは、移動・削除ができません。代わりに svn:externals
プロパティを変更しなければなりません。