4

SVN リポジトリに大きなプロジェクトがあります。プロジェクトのいくつかのモジュールを他のアプリケーションで使用したいので、コードを最新の状態に保つために、メインの SVN リポジトリからそれらをチェックアウトすることを考えました。

リポジトリの1つのフォルダー/モジュールを「エクスポート」して、そのモジュールのみを他のプロジェクトにチェックアウトするにはどうすればよいですか? そのモジュールを含めたい他のプロジェクトも、独自の SVN リポジトリにあります。

履歴書では、SVN 更新をメイン リポジトリに実行できるようにしたいのですが、コミットはプロジェクト リポジトリに実行したいと考えています。

私がやりたいことが明確になることを願っています。

DavidW anwser への応答:

  • 複数のプロジェクトを含む 1 つのリポジトリがありますが、必要に応じてこれを変更することがあります。
  • ソースコードを公開したい。そのphpプロジェクト。モジュールをフォークしています。(私はグローバルな汎用プロジェクトを持っており、
    クライアントが特定の機能を必要とする場合、
  • そのクライアント用に別のプロジェクトを作成したい(svnでも別)。しかし、メイン プロジェクトで行われたいくつかの変更を クライアント プロジェクト
    にマージする方法が必要です。
    (例: グローバルなバグ修正または機能)。
4

2 に答える 2

1

いくつかの質問:

  • 複数のリポジトリ、または同じリポジトリ内の複数のプロジェクトについて話しているのですか?
  • この他のモジュールのコードを借用する場合、他のモジュールとの同期を維持していますか?それとも、そのモジュールをフォークしていますか?
  • あなたが本当に共有したいものは何ですか?ソース、またはコンパイル済みの出力 (*.soまたは*.aUnix C/C+、*.jarJava など)を共有する必要がありますか?

あなたが与える答えは、これらの質問に対するあなたの答えに大きく依存します。

コードが実際に共有されていると仮定しましょう。一方で行うことは、他方で行いたいことです。プロジェクトに変更を加えると、他のプロジェクトのコードも変更されます。

その場合は、 を使用してsvn:externalsください。これは、ディレクトリに配置するプロパティです。それが行うことは、Subversion URL をサブディレクトリ名に関連付けることです。例えば:

$ svn propset svn:externals "http://svn.vegibanc.com/svn/trunk/project/stuff utils" .

プロパティを現在のディレクトリに配置します。更新またはチェックアウトを行うと、というディレクトリutilsがプロジェクトに作成され、Subversion はそのディレクトリに自動的にチェックアウトhttp://svn.vegibanc.com/svn/trunk/project/stuffします。それは魔法ですが、すべての魔法と同様に、明るい面と暗い面の両方があります。

まず第一に、ライトサイド:

これは、2 つのプロジェクト間でコードを共有しています。ディレクトリに変更を加えutilsて変更をコミットすると、stuffサブディレクトリprojectが更新されます。プロジェクトにツールを組み込むために使用します。ツールをアップグレードすると、すべてのプロジェクトがアップグレードされたツールを取得します。

さて、ダークサイド:

私が示したようにを定義するsvn:externalsと、非常に後悔することになります。リリースのために作業を分岐することにした場合を想像してみてください。さて、あなたのディレクトリはまだof をutils指しています。リリース 2.1 に分岐し、trunk が現在 2.2 で動作している場合、不要なものを取得することになります。trunkproject/stuffutils

utilsさらに悪いことに、タグを作成すると、トランク内のそのディレクトリがまだ変更されているため、そのタグは変更され続けます。

したがって、 URL の正確なバージョンを指定することを強くお勧めします。

$ svn propset svn:externals "-r23283 ^/trunk/project/stuff@23283 utils" .
$ svn propset svn:externals "^/tags/2.3.3/project/stuff utils" .

最初に、URL の特定のリビジョンについて言及しています。それはまったく変わらない。別のリビジョンを指す必要がある場合は、svn:externalsプロパティ自体を変更する必要があります。

2 つ目は、特定のタグを指しています。タグが変更される可能性があるため安全ではありませんが、この方法で外部依存関係をリリースとして扱うことができます。スタッフユーティリティのリリース 2.3.3 を使用しています。

どちらも、単にSubversion Repository Root^を意味するショートカットを使用しています。このように、Subversion リポジトリを別のシステムに移動したり、 からに変更したりしても、外部は引き続き機能します。もちろん、このようにすると、 の下のコードを変更することはできなくなります。そして、これはあなたが望むものではありません。httpsvnsvn:externals

相対URL も使用できますが、少し危険です。

次のような 2 つのプロジェクトを想像してください。stuffディレクトリをutilsディレクトリへのsvn:externalリンクにしたいとします。

http://svn.vegibanc.com/svn/trunk/project/foo/stuff
http://svn.vegibanc.com/svn/trunk/project/bar/utils

プロジェクトは一緒に分岐され、一緒にタグ付けされます。あなたはこれを行うことができます:

$ co http://svn.vegibanc.com/svn/trunk/project/bar bar-trunk
$ cd project-bar
$ svn propset svn:externals "../foo/stuff utils" .

これにより、 stuffディレクトリが外部のutilsディレクトリにリンクされます。ただし、それは相対的な方法で行われます。これを行う場合:

$ cp http://svn.vegibanc.com/svn/trunk http://svn.vegibank.com/svn/branches/2.3

utilsディレクトリは引き続きfoo プロジェクトの下のstuffディレクトリに外部的にリンクされますが、どちらも 2.3 ブランチにあります。

コードbar/utilsを変更すると、コードが変更されfoo/stuff、その逆も同様です。あなたはまだコードを共有していますが、両方のプロジェクトが同じブランチにあるという方法で.

後で、次のようにタグ付けすると:

$ cp http://svn.vegibank.com/svn/branches/2.3 http://svn.vegibank.com/svn/tags/2.3.0

タグ 2.3.0 が変更される可能性は低いです。なぜなら、外部リンクとそれらがリンクするものはすべてそのタグで囲まれているからです。

上記は、コードを共有していることを前提としており、いずれかのプロジェクトの変更が他方に影響を与えるはずです。

これを行うためのより良い方法はfoo、リリース サーバーに格納できる何らかのコンパイル済みオブジェクト (JAR ファイルや *.so など) を作成することです。このコンパイル済みオブジェクトを独自のバージョン管理を持つ独自のプロジェクトとして扱い、プロジェクトはこのオブジェクトの特定のリリースに依存します。残念ながら、それは常にうまくいくとは限りません。

コードを単純にフォークする場合はsvn cp、リポジトリ内のある場所から別の場所に移動します。他のプロジェクトに影響を与えることなく変更を加えることができ、その逆も同様です。さらに良いことに、2 つの場所の間で行ったり来たりする変更をマージして、多少の同期を保つことができます。

これがあなたの質問に答えることを願っています。質問を拡大して、ご希望の詳細をお知らせいただければ、回答を更新できます。

于 2013-04-11T13:34:34.173 に答える
1
  • Subversion リポジトリ内で共有コードを使用する場合は、svn:externals です。
  • 共有コードのメインラインから共有コードの顧客固有バージョンへのポート変更が必要な場合は、svn 用語で「ベンダー ブランチ」です。

a) と b) を組み合わせると、必要な結果が得られます

  1. dev-repo の共有ノードにリンクするいくつかのノード (顧客のリポジトリの外部トランク) を選択します。
  2. 外部定義を作成します (dev-repo へのコミット後に手動で定義を更新するコストを簡単に取り戻さなければならない場合は、PEG リビジョンを使用することをお勧めします)
  3. ノードをライブ プロジェクト内の場所にコピーします ( svn cp ...)
  4. コード...
  5. dev-repo に変更があり、それを顧客リポジトリに転送したい場合 - 外部を必要なリビジョンに更新し、「Vendor」ノードを「Live」にマージします

サンプル:

顧客のリポジトリにある場合

  • /vendor/lib (lib は外部レポのディレクトリ) */trunk/common/lib (上記の lib の顧客のバージョン)

lib-mainline からの変更の組み込みは、/vendor/lib から /trunk/common/lib へのマージです (トランクの作業コピーの対応するノード内)。

外部に関する David のメモは今でも有効で、正しく、有用です。

于 2013-04-11T20:12:48.400 に答える