過去にHgサブレポの依存関係についていくつかの質問がありました(こことここ)が、受け入れられた回答は私にとって問題に対処していないようです.
私のプロジェクトには、A、B、C、D の 4 つの依存関係があります。D は A、B、C に依存しています。B と C は A に依存しています。
Hg サブリポジトリを使用してそれらを保存し、それらが依存しているそれぞれのバージョンを追跡できるようにしたいと考えています。これは、このプロジェクトで A、B、C、および D を使用している間、他のプロジェクトでは A と B だけが必要になるためです。したがって、B と C は、D とは別に必要な A のバージョンを追跡する必要があります。同時に、私のアプリケーションでは、特定のバージョンの D によって参照される B と C のバージョンは、常に、D によって参照されるものと同じバージョンの A を使用する必要があります。 D の指定されたバージョン (それ以外の場合は、実行時にフォールオーバーします)。私が本当に望んでいるのは、それらが同じディレクトリ内の兄弟として相互に参照できるようにすることです。つまり、D の .hgsub は次のようになり、B と C は最初の行のようになります。
..\A = https:(central kiln repo)\A
..\B = https:(central kiln repo)\B
..\C = https:(central kiln repo)\C
しかし、これはうまくいかないようです: 理由はわかります (人々に首を吊るすのに十分なロープを与えるのは簡単でしょう) が、私の依存関係に対する最も適切な解決策だと思うので、それは残念です. いくつかの提案された解決策を読みましたが、それらについて簡単に概説し、それらがうまくいかない理由を説明します。
ネストされたサブディレクトリとしてコピーを含め、これらを Hg サブリポジトリとして参照します。これにより、次のディレクトリ構造が生成されます (代わりに \D 内のコピーを参照することを受け入れることができるため、A、B、C、B\A、C\A のプライマリ コピーを削除しました)。
- project\ (すべてのメイン プロジェクト ファイル)
- プロジェクト\D
- プロジェクト\D\A
- プロジェクト\D\B
- プロジェクト\D\B\A
- プロジェクト\D\C
- プロジェクト\D\C\A
このアプローチの問題:
- 現在、ディスク上に A の 3 つのコピーがあり、そのすべてに独立した変更が含まれている可能性があり、中央リポジトリにプッシュする前に同期およびマージする必要があります。
- B、C、および D が同じバージョンの A を参照していることを確認するために、他のメカニズムを使用する必要があります (たとえば、D は v1 を使用し、D\B は v2 を使用できます)。
バリエーション: 上記を使用しますが、親コピーのコピーを指すように .hgsub の RHS を指定します(つまり、B と C には以下の .hgsub が必要です)。
A = ..\A
このアプローチの問題:
- ディスクにはまだ 3 つのコピーがあります
- 初めて B または C を複製すると、参照されているバージョンの A を "..\A" から再帰的にプルしようとしますが、これは存在しない可能性があり、おそらくエラーが発生します。存在しない場合、レポがどこにあるのかについての手がかりが得られません。
- 変更を再帰的にプッシュすると、D\B\A の変更が共有の中央レポに反映されません。代わりに D\A にプッシュされるだけです。したがって、2 回続けてプッシュすると、すべての変更が正しく反映されることを保証できますが、これはかなりの間違いです。
- 同様に、(手動で) 再帰的なプルを行う場合、最新の変更を取得するために正しい順序を取得する必要があります (つまり、D\B\A をプルする前に D\A をプルします)。
シンボリックリンクを使用して、フォルダー \D\B\A を D\A などにポイントします。
このアプローチの問題:
- シンボリック リンクは Hg リポジトリ自体でエンコードできないため、チーム メンバーがリポジトリを複製するたびに、手動またはスクリプトを使用してシンボリック リンクを再作成する必要があります。これは許容できるかもしれませんが、より良い解決策を希望します。また (個人的な好み) シンボリック リンクは非常に直感的ではありません。
これらは利用可能な最善のソリューションですか? 私の最初の .hgsub (上を参照) が夢物語である正当な理由はありますか、またはこの変更を要求/実装する方法はありますか?
A、B、C、Dのより広い使用法をよりよく説明するために更新されました