外部項目

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

外部フォルダ

では /project1 の作業コピーを D:\dev\project1 にチェックアウトしましょう。D:\dev\project1 フォルダを選択し、右クリック してコンテキストメニューのWindows メニュープロパティ+追加...+設定

URL は適切にエスケープされねばならず、そうでなければ動作しません。例えば、前述の 2 番目の例にあるように、各空白を %20 に置換しなければなりません。

ローカルのパスに空白や特殊文字を使用したい場合、二重引用符で囲ったり、Unix シェル形式のエスケープ文字 \ (バックスラッシュ) を特殊文字の前に置いてください。もちろんこれは、パス区切り文字に / (スラッシュ) を使わなければならない、ということでもあります。この挙動は Subversion 1.6 の新機能で、それ以前のクライアントでは動作しないことに注意してください。

明確なリビジョン番号の利用

前述のように、外部参照定義のすべてにおいて、明示的なリビジョン番号を使用することを強く意識するべきです。そうすることは、異なる外部参照情報のスナップショットを取り出す際、正確にどのスナップショットを取り出すかを決めることを意味します。コントロールが及ばないサードパーティのリポジトリに変更があっても驚かないと言う常識に加え、明示的なリビジョン番号を使用するということは、作業コピーを以前のリビジョンに戻すということでもあります。外部参照定義はまた、以前のリビジョンを見るように元に戻り、リポジトリが過去のリビジョンになっているなら、外部参照の作業コピーは一致するように以前を参照するように更新されます。ソフトウェアプロジェクトにおいて、これは複雑な古いコードベースを構築するのが成功するか失敗するかと言った違いに現れます。

古い svn:external の定義

この形式は Subversion 1.5 で導入されました。古い形式で、同じ情報を異なる順番で見ることもできます。新しい形式は、以下で説明する便利な機能を提供するため好まれていますが、古いクライアントでは動作しないでしょう。差異は Subversion Book でご覧になれます。

外部プロジェクトが同じリポジトリにある場合、メインプロジェクトをコミットしたときに、外部プロジェクトに行った変更もコミットされてしまいます。

外部プロジェクトが別のリポジトリにある場合、メインプロジェクトのコミット時に、外部プロジェクトに対する変更は通知されますが、別々にコミットする必要があります。

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 の後にペグリビジョンも指定できます。例えば http://sounds.red-bean.com/repos@19 といった形です。

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

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

外部ファイル

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

  • 外部ファイルへのパスは、既存のバージョン管理下にあるフォルダにファイルを配置しなければなりません。一般的に、svn:externals がセットされているフォルダに、直接ファイルを配置するのがほとんどだと思いますが、バージョン管理下のサブフォルダにすることもできます。対照的に、外部ディレクトリは、必要に応じてバージョン管理外の中間サブフォルダを、自動的に作成します。

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

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

Subversion 1.6 でのファイル外部項目サポートは不完全

subversion 1.6 では、一度追加してしまうと、svn:externals 属性をすべて削除したとしても、外部ファイルを作業コピーから削除できません。ファイルを削除するには、新しい作業コピーをチェックアウトする必要があります。