0

私の svn リポジトリでタグ付けされたバージョンをチェックアウトする際に問題が発生しました。これはおそらく、内部の 'svn:externals' が正しいリビジョンを参照していないことが原因です。単純化された状況を考えてみましょう:

リビジョン XXX1 で次のような最初の svn リポジトリがあります。

Repo1 (@ Rev XXX1)
  tags
    ...
  trunk
    Folder1
      ExternalRefToFolder2 (svn:externals '../Folder2')
    Folder2
      SomeFile1.txt
      SomeFile2.txt

そして、これは(ヘッドリビジョンで)リファクタリングされました:

Repo1 (@ HEAD1)
  tags
    ...
  trunk
    Folder1
      SomeFile1.txt
      SomeFile2.txt

IE: 良くも悪くも、 への外部参照は削除され、リビジョンとFolder2の間のファイル コピーに置き換えられました。XXX1HEAD1

同じサーバーに次のような 2 つ目のリポジトリもあります。

Repo2 (@ HEAD2) 
  tags
    1.0.0
      ExternalToRepo1 (svn:externals -rXXX1 ^/../Repo1/trunk)
  trunk
    ExternalToRepo1 (svn:externals ^/../Repo1/trunk)

IE: 繰り返しますが、良くも悪くも、2 番目のリポジトリは外部参照を使用して最初のリポジトリを参照しています (タグ付きバージョンのリビジョンとリビジョンHEAD1ですべてを正しいリビジョンで固定するため)。trunkXXX1

問題

  • trunkのをチェックアウトしているときRepo2、問題はありません。それはRepo1、その単一の でチェックアウトされますFolder1

  • 1.0.0のタグをチェックアウトすると、svnはリビジョンでRepo2見つからないと文句を言います。http://server//Repo1//trunk//Folder2HEAD1

したがって、タグが正しいリビジョン1.0.0を参照していても、すべてそのように見えます。内部の外部は、 (私が期待していたリビジョンではなく)に基づいているかのように解釈されます。Repo1/trunkXXX1svn:externals '../Folder2'HEAD1XXX1

この動作は正常ですか? また、この問題を回避するにはどうすればよいですか?

注意: 私が持っている Svn バージョンは、2012 年 12 月 12 日にコンパイルされた 1.7.8 (r1419671) です。

編集

Repo1問題を再現するもう 1 つの方法は、リビジョンをチェックアウトするか、単に参照することXXX1です。svn:externals '../Folder2'その後も相対的になるHEAD1ので、解決策はあまりないと思います。

4

2 に答える 2

1

svn:externals貧しい人の依存関係管理やコード重複回避スキームとして使用することは、あなたの悩みの種です。それらを入れ子にすることは二重に悪いことではなく、乗法です。外観の悪さについてのこの優れた長い回答をお勧めします

内部用に使用しても素晴らしい結果が得られることは決してありませんがsvn:externals、使用し続けると、次の方法で痛みを軽減できます。

  1. レッドブックのアドバイスに従い、頭を外から引っ張らないでください。

すべての外部定義で明示的なリビジョン番号を使用することを真剣に検討する必要があります。そうすることで、外部情報の別のスナップショットをいつ取得するか、どのスナップショットを取得するかを正確に決定できるようになります。明示的なリビジョン番号を使用すると、サードパーティのリポジトリに変更が加えられて自分では制御できないという驚きを回避できるだけでなく、作業コピーを以前のリビジョンにさかのぼると、外部定義も元の状態に戻ることになります。これは、外部の作業コピーが、リポジトリがその前のリビジョンにあったときに振り返った方法と一致するように更新されることを意味します。ソフトウェア プロジェクトの場合、これは、複雑なコードベースの古いスナップショットの成功したビルドと失敗したビルドの違いになる可能性があります。

  1. 上記を行わない場合は、svncopy.plでタグを作成してください。タグを作成すると、外部のリビジョンが何であれ「固定」されます。

複数のリポジトリを持っている理由については言及していませんでした。統合によってメリットが得られる可能性はありますか?
使用している言語/ツールについては言及していません。あなたの要件を満たすためのより良い方法があると確信しています。たとえば、外部経由でプルするいくつかのライブラリを含む Java アプリの場合、ライブラリを個別にビルドし、maven のような物質を使用してそれらを公開し、アプリをビルドするときにそれらを解決すると、より便利になります。

于 2013-04-04T02:47:01.563 に答える