16

コードの共有部分 (さまざまな機能/スタイル/javascript など) を使用する、同じクライアント用の 2 つの Web サイト (メインの www サイトと、別のサーバー上にある e コマース サイト用の別のサイト) があります。現在、共有コードを SVN の別のプロジェクト (同じリポジトリ内) として保持し、svn:externals を使用してこれらのそれぞれのブランチを 2 つの Web サイト プロジェクトにプルすることで、これを管理しています。

2 つのサイトにそれぞれ 1 つずつ、2 つのリリース ブランチを作成しました。作業中はすべてが通常どおり各サイトのトランクにコミットされ、「ライブの準備ができた」ときに、そのサイトのリリース ブランチにマージされます。今日、共有コードの一部を変更し、リリース ブランチで更新を行ったときに、リリース ブランチがすぐにそれを取り込んでいることに気付きました。これは私たちが望んでいたものではありません:(

この問題を解決する方法を教えてください。コードの共有をドライアップするためにエクスターナルを使用しましたが、別の方法はありますか? この質問 ( SVN で分岐して、svn:external フォルダーも分岐させるにはどうすればよいですか? ) では、外部が悪いと言及されており、別のビルド プロセスを使用する必要がありますが、それがどうあるべきかについては言及されていません。

ビルドを実行する CruiseControl.net があり、この問題を解決したいと考えています。より良いプロセスに関するアイデアはありますか?

乾杯

ピート

更新: それ以来、ソース管理に Mercurial (Fogcreek's Kiln) を使用するようになりました。Mercurial にもサブリポジトリのアイデアがあるため、プロジェクトでもそのルートに従いました。ただし、コストがかかります。分岐は、タグ付けと単純にすべてを最新の状態に保つのと同様に非常に困難になります。私たちの最新の方法は、すべての共有リポジトリも含めて、両方のプロジェクトを 1 つのリポジトリにまとめることです。これにより、クローン時間を遅くする 1 つの「メガ プロジェクト」が得られます (SVN で確認してください)。現在、分岐ではなく機能の切り替え/トグルを使用しているため、開発が大幅に簡素化されています。

4

5 に答える 5

19

私が正しく理解している場合、次のような構造があります。

  • プロジェクト1
    • トランク
      • ライブラリ (経由svn:externals library svn://repo/library)
      • リリース1
        • ライブラリ (経由svn:externals library svn://repo/library)
      • リリース2
        • ライブラリ (経由svn:externals library svn://repo/library)
  • プロジェクト2
    • トランク
      • ライブラリ (経由svn:externals library svn://repo/library)
      • リリース1
        • ライブラリ (経由svn:externals library svn://repo/library)
  • 図書館

svn:externals/project1/trunk を /library に設定していると仮定します。その後、リビジョンsvn:externalsを /project1/branches/release1 にマージしてそのブランチを更新すると、ライブラリから自動的に最新バージョンが取得されます。デフォルトでは、svn:externals はリンクの HEAD リビジョンを取得します。

svn:externals次のように、特定のリビジョンにリンクするように を定義できますsvn:externals -r123 library svn://repo/library。これは、外部リンクが常にその特定のリビジョンを指すことを意味します。したがってsvn:externals、手動でsvn:externals

おそらくより良い方法は、共有ライブラリのタグを使用して特定のタグにリンクすることです。この場合、次のリポジトリ構造が得られます。

  • プロジェクト1
    • トランク
      • ライブラリ (経由svn:externals library svn://repo/library/tags/version3)
      • リリース1
        • ライブラリ (経由svn:externals library svn://repo/library/tags/version1)
      • リリース2
        • ライブラリ (経由svn:externals library svn://repo/library/tags/version2)
  • プロジェクト2
    • トランク
      • ライブラリ (経由svn:externals library svn://repo/library/tags/version2)
      • リリース1
        • ライブラリ (経由svn:externals library svn://repo/library/tags/version1)
  • 図書館
    • タグ
      • バージョン1
      • バージョン2
      • バージョン3
于 2010-02-11T13:28:18.177 に答える
3

Otherside には良いアドバイスがありますが、実際には svn:externals を貧弱な依存関係管理システムとして使用しています。これは、ハックなアンチパターンを、規律のある人にとってはある程度機能するようにしています。

svn:externals がパスではないことは間違いありません。

もう1つ考えるべきことは、そのパスにとどまる場合-svnタグが(プリコミットフックを介して)アトミックでない限り、タグと同様にリビジョンを指定する必要があることです。

私は現在、いくつかの.NETのものを継承したことにシェルショックを受けており、mavenが恋しくなります。私はアリ/ツタの混乱にさえ落ち着くでしょう。

https://www.nuget.org/を確認してください。

于 2010-12-13T04:04:39.170 に答える
1

svn update --ignore-externals外観を更新したくない場合は、これを行うことができます。

于 2010-02-02T13:58:40.593 に答える
1

はい、特定のリビジョンまたはタグを指す外部を使用するのが方法です。これは、外観に関するsvnマニュアルを読むだけで簡単に見つけることができます... RFD!また、約1ページの長さです... :)

http://svnbook.red-bean.com/en/1.0/ch07s03.html

于 2010-02-12T02:52:28.380 に答える
0

ブランチがトランクから完全に独立するように、外観もコピーしてリリース/安定ブランチを作成しています。外部は次を使用してsvn-copyedです

svn コピー --親

...それぞれのマウントポイントに。unrevisioned externals は、ブランチをルート化するリビジョンを使用します。リビジョンされた外部は、コピー時に指定されたリビジョンを使用しました。svn:externals プロパティは、新しいブランチで削除する必要があります。

一部のスクリプト (私にとっては perl) は、これを自動化するのに役立つ場合があります。これについてさらに情報が必要な場合は、私に連絡してください。

于 2011-10-20T15:07:52.710 に答える