svn:externals
はファイルのプロパティであり、それらを変更するにはコミットが必要であることを理解する必要があります。ミラーがあり、 を変更するとsvn:external
、新しいリモート バージョンが作成され、ミラーが壊れます。リビジョンが整列しなくなります。
当時は素晴らしいアイデアのように見えsvn:externals
ましたが、プロジェクトでは非常に悪いものになる可能性があります. 次のようなプロジェクトを想像してください。
http://vegibank.com/svn/trunk/project1
そして、私はこのディレクトリにsvn:external
$ svn pset svn:external "^/trunk/project2/foo foo" .
foo
ディレクトリが複数のプロジェクトのファイルの共有セットであるため、これを行います。
ここで、project1 のタグを作成します。
$ svn cp http://vegibank.com/svn/trunk/project1 http://vegibank.com/svn/tags/1.2.3
project1/foo
ディレクトリがタグ付けされていないことを除けば、見栄えがします。のトランクにつながっていproject2/foo
ます。
タグに関する私の仮定は、タグは決して変更されないということですが、これは正しくありません。作業はトランクでまだ行われてproject2/foo
おり、それによって私のタグが表すものが変わります。リリース 1.2.3 にバグがあり、何が問題なのかを確認するためにタグをチェックアウトすることにした場合、リリースしたものを必ずしも取得しているとは限りませんproject1/foo
。トランクから最新のものを取得しています。
これを処理するためのより良い方法は、リリース リポジトリを作成し、さまざまなプロジェクト間で共通のコードをある種のコンパイル済みアーティファクトとしてビルドし、プロジェクトをそのアーティファクトのそのバージョンに依存させることです。最終的には、 の特定のバージョンに依存する C プログラムlibz.so
や、 のバージョン 1.6 に依存する Java プロジェクトと何ら変わりはありませんorg.apache.commons.httpd
。
これにより、ミラーリングを使用する必要がなくなり、svn:externals
簡素化されます。ソース リポジトリだけでなく、リリース リポジトリもミラーリングできます。
どうしても を使用する場合svn:external
は、完全な URL を使用しないでください。代わりに、相対 URL を使用してください。
たとえば、これの代わりに上記の `svn:external をセットアップした場合:
$ svn pset svn:external "^/trunk/project2/foo foo" .
これをする:
$ svn pset svn:external "../project2/foo foo" . #property on ^/trunk/project1
ここで、次のようなタグを作成すると:
$ svn cp http://vegibank.com/svn/trunk http://vegibank.com/svn/tags/1.2.3
project1
と の両方にタグを付けていproject2
ます。さて、私svn:external
は を指しhttp://vegibank.com/svn/tags/1.2.3/project2/foo
ます。
必要なのは、この方法で svn:externals を強制する方法です。pre-commit フックを使用して、実際のリビジョンを指定せずにまたはディレクトリsvn:external
を参照するセットを持つコミットを拒否できます。trunk
branches