いくつかの質問:
- 複数のリポジトリ、または同じリポジトリ内の複数のプロジェクトについて話しているのですか?
- この他のモジュールのコードを借用する場合、他のモジュールとの同期を維持していますか?それとも、そのモジュールをフォークしていますか?
- あなたが本当に共有したいものは何ですか?ソース、またはコンパイル済みの出力 (
*.so
または*.a
Unix C/C+、*.jar
Java など)を共有する必要がありますか?
あなたが与える答えは、これらの質問に対するあなたの答えに大きく依存します。
コードが実際に共有されていると仮定しましょう。一方で行うことは、他方で行いたいことです。プロジェクトに変更を加えると、他のプロジェクトのコードも変更されます。
その場合は、 を使用して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 で動作している場合、不要なものを取得することになります。trunk
project/stuff
utils
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 リポジトリを別のシステムに移動したり、 からに変更したりしても、外部は引き続き機能します。もちろん、このようにすると、 の下のコードを変更することはできなくなります。そして、これはあなたが望むものではありません。http
svn
svn: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 つの場所の間で行ったり来たりする変更をマージして、多少の同期を保つことができます。
これがあなたの質問に答えることを願っています。質問を拡大して、ご希望の詳細をお知らせいただければ、回答を更新できます。