かなり標準的なソースツリーアプローチと水銀サブリポジトリを使用しているマスタープロジェクトがあります。
Master
\lib - compiled binaries - things like log4net, AutoFac, etc
\source - VS solution, one folder per project, etc
\tools - stuff used during the build process
\source\contrib - contains any subrepos like so:
\source\contrib\Sub1
\source\contrib\Sub2
Master\.hgsub contains something like
source\contrib\Sub1 = https://myserver.com/Sub1
さて、最近、Sub2にはSub1からのコードが必要であると判断されたため、この新しい依存関係構造を調整する必要があります。
もちろん問題は、上記と同じアプローチに従い、Sub1をSub2のサブリポジトリとして追加すると、この醜い状況になってしまうことです。
\source\contrib\Sub2\source\contrib\Sub1
マスターには、Sub1の2つの独立したコピーがあります。
したがって、サブリポジトリ(=のRHS)を参照するときに相対パスを使用する必要があることはわかっていますが、理解しているので、ここでのシナリオには役立ちません。LHSをマスターリポジトリの外でライブにする方法はないと思います。これが私がここで本当に必要としていることだと思います。
私はこれを修正する方法についていくつかのアイデアを持っていますが、どれも私にぴったりではなく、より良い方法が必要だと思います。私の理想的なソリューションでは、複数のコピーを持っているというペナルティを支払うことなく、複数のプロジェクト間で同じサブリポジトリを共有できます。これは、ここでの私のシナリオでは無駄で非効率に思えます(さらに、Sub1に依存するすべてのプロジェクトで、個別にリビジョンを作成するのではなく、同じhgリビジョンを使用するようにしたい)
マスターのサブリポジトリとしてSub1を削除し、マスターソリューションの相対パスを変更して、二重にネストされたSub1を参照します。このパス構造は恐ろしいだけでなく、Sub1に依存するマスターにSub3を追加した場合でも、Sub1のコピーが2つあります。
Sub1のコピーをコンパイルし、\libディレクトリにチャックするだけです。Sub1はまだいくつかのチャーンが発生しているので、ソースバージョンに対してビルドしたいと思います。新しいバイナリを常にソースツリーにコピーする(そしてツリーを肥大化させる)という税金を払いたくありません。
どういうわけかSub2のSub1への依存を破ります。リポジトリのアーキテクチャに基づいて、これはおそらく起こらないでしょう。Sub1には、非常に汎用的な共有ライブラリコードが含まれています。Sub2には、2つの非常に別個のプロジェクト(クライアントSDKとサーバー実装)で必要なWCFサービスコントラクト/インターフェイス/タイプが含まれています。この時点で、これらのリポジトリを分離しておくことは理にかなっています。
多分私はこれが間違っていると思っています...あるいは多分私はいくつかのhgトリックに気づいていません。
どんな助けでも大歓迎です。