外部項目

時には、たくさんの異なるチェックアウトから作業コピーを構成するのは、便利なことがあります。たとえば、リポジトリ内の異なる場所もしくは異なるリポジトリにある、異なるサブディレクトリが必要になるかもしれません。全てのユーザーが同じレイアウトを保持するには、svn:externals プロパティを設定し、必要なところから指定したリソースを取得します。

外部フォルダー

さて、ここで/project1の作業コピーをD:\dev\project1にチェックアウトとするとしましょう。D:\dev\project1フォルダーを選択して右クリックし、コンテキストメニューからWindows メニューのプロパティを選択します。プロパティダイアログが表示されます。次に 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-1http://example.com/svn/repos-2)があると仮定します。C:\Workinghttp://example.com/svn/repos-1/project/trunk のチェックアウトがあり、トランクに svn:externals プロパティをセットしています。

親ディレクトリへの相対パス

この URL は、以下の例のように、常に ../ という文字列で始まります。

../../widgets/foo  common/foo-widget

これは、C:\Working\common\foo-widgethttp://example.com/svn/repos-1/widgets/foo を抽出します。

URL が、ディスクに書かれている外部参照のディレクトリではなく、svn:externals プロパティにあるディレクトリの URL への相対パスであることに注意してください。

リポジトリのルートへの相対パス

この URL は、以下の例のように、常に ^/ という文字列で始まります。

^/widgets/foo  common/foo-widget

これは、C:\Working\common\foo-widgethttp://example.com/svn/repos-1/widgets/foo を抽出します。

同じ SVNParentPath (複数のリポジトリを保持する共通ディレクトリ) にある他のリポジトリに、容易に参照できます。例は以下のようになります。

^/../repos-2/hammers/claw  common/claw-hammer

これは、C:\Working\common\claw-hammerhttp://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/foosvn+ssh://example.com/svn/repos-1/widgets/foo を抽出します。

サーバーのホスト名への相対パス

/ で始まる URL は URL のスキーム部とホスト名部をコピーします。以下に例を挙げます。

/svn/repos-1/widgets/foo  common/foo-widget

これは C:\Working\common\foo-widgethttp://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 をご覧ください。

重要

上記の例のように外部の対象フォルダをサブフォルダとして指定する場合、必ず両者の 全ての フォルダがバージョン管理されていることを確認してください。上記の例の場合、common フォルダがバージョン管理されている必要があります。

ほとんどの場合、両者がバージョン管理されていなくても動作しますが、一部の操作は期待通りに動作しないことがあります。また、エクスプローラのステータスオーバーレイアイコンが正しいステータスを表示しなくなります。

TortoiseSVN がプロパティをどのように扱うかについての詳細な情報は、 「プロジェクト設定」 を参照してください。

共通サブプロジェクトへの他のアクセス方法については、 「共通のサブプロジェクトを含める」 を参照してください。

外部ファイル

Subversion 1.6 では、フォルダーと同じ文法を用いて、単一ファイルの外部項目を作業コピーに追加できます。しかし、いくつか制限事項があります。

  • 外部参照ファイルへのパスは、svn:externalsプロパティで設定したフォルダーの直下の子でなければなりません。

  • 外部ファイルの URL が、外部ファイルを挿入する URL と同じリポジトリになければなりません。つまり、リポジトリ間の外部ファイルはサポートしていません。

外部ファイルの挙動は、あらゆる点でその他のバージョン管理下のファイルと同等ですが、通常のコマンドでは、移動・削除ができません。代わりに svn:externals プロパティを変更しなければなりません。

ドラッグ&ドロップで外部参照を作成

ファイルやフォルダーの作業コピーを作成済みで、他の作業コピーの外部参照として設定したい場合は、Windowsエクスプローラーからドラッグ&ドロップするだけで追加することができます。

ファイルやフォルダーを、ある作業コピーから外部参照を設定したい場所に右ドラッグしてください。マウスボタンを離して現れるコンテキストメニューで、SVN ここに外部参照として追加というメニュー項目をクリックすると、svn:externals