3

svn:externalsをかなり広範囲に使用するSubversionセットアップがあります(1つのプロジェクトに5つ以上の外部参照があり、ほとんどが同じリポジトリにありますが、1つまたは2つは異なるリポジトリにありますが、同じサーバー上にあります)。現在、svn:externalsプロパティは、参照されるプロジェクトの完全なURL(つまり、「https:// [server]:[port] / svn / Repository1 / Projects / ...)」を持つように設定されています。

最近、リポジトリを外部のオフサイト施設にバックアップするsvnsyncを使用してSVNミラーを設定しました。リモートサイトでミラーリングされたリポジトリから読み取り専用のチェックアウトを実行する機能が必要です。これは、外部をプルしようとする場合を除いて、ほとんどの部分で正常に機能しているようですが、ローカルのオンサイトサーバーを参照します。

これが最善の方法かどうかはわかりませんが、リモートの場所にある種のコミット後フックを設定して、svn:externalsのプロパティを変更し、ここでローカルサーバーのホスト名を次のように置き換えたいと思います。そこにあるリモートサーバーのホスト名。このフックは、svnsyncによって行われた各コミットの後に実行されます。

理想的には、サーバー名を含めないようにメインリポジトリのsvn:externalsプロパティを変更しないようにします。

誰かが以前にこの問題に遭遇したことがありますか?それについて行くための最良の方法は何ですか?

4

2 に答える 2

4

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を参照するセットを持つコミットを拒否できます。trunkbranches

于 2013-03-14T04:05:11.453 に答える
1

どのバージョンのsvnを実行していますか?svn:externals 現在の場合は、レッドブックを読んでホスト名を入れるのを避けることができます。 具体的には、外部で開始することを確認してください。 /

特にリンクが同じリポジトリを指している場合は、モラスから抜け出すことを強く検討する必要がありsvn:externalsます...分岐してタグ付けするのが難しくなります。私は多くのsvn実装を見てきましたが、svn:externalsは通常悪臭です。

また、原則として、開発者の意図を変更するコミット後のフックを設定するのは最適ではないと思います。この場合、あなたはおそらく大丈夫でしょうが。

于 2013-03-13T23:16:53.117 に答える