0

私は現在CVSNTからMercurialに移行していますが、CVSモジュールで達成できたものに問題が発生しています。AとBという2つのプロジェクトがあり、どちらもディレクトリCの共通コードに依存しています。ディレクトリCのコードに変更を加えた場合、その変更をプロジェクトAとBの両方に反映させたいと思います(ここでの問題の正反対)

これはサブリポジトリを使用して実現できると思いましたが、プロジェクトAとBの.hgsubstateは、私がリストしたサブリポジトリの変更セットを記録しています。つまり、プロジェクトAでCの変更をコミットし、更新してコミットするにはBを手動で開く必要があります。(実際には、AとBだけのプロジェクトがもっとたくさんあります。もちろん、共通のコードは共有ライブラリにあるべきだと私は知っていますが、PHBは主張しています!)

これを達成する方法はありますか?理想的には、リポジトリがどのように構成されているかをユーザーに透過的にしたいと思います。つまり、ユーザーはCに変更をコミットでき、プロジェクトのサブリポジトリであることに気付く必要はありません。(現時点では、Tortoise Hgは「S」を使用してサブレポがダーティであることを示しています)。私が必要としているのはパパレポと部分的なチェックアウトだと思いますが、確かにもっと良い方法があるはずですか?私はWindowsを使用しているので、シンボリックリンクが出ています。

4

1 に答える 1

0

サブリポジトリを手動で更新(およびコミット)する必要があるという事実は、非常に意図的なものです。CVSとSVNで見つかったこの誤った機能は、意図的に省略されています。

サブリポジトリを最新のコミットに自動的に更新する場合、コードが機能し続けるという保証はありません。たとえば、CのAPIを変更する場合、それに応じて変更するまで、AもBも機能しません。また、複数のリポジトリを同時にアトミックにプッシュすることはできないため、AとBが機能しないウィンドウが不可避的に発生します。実際には、このウィンドウはかなり大きくなる可能性があります。特に、依存しているプロジェクトの1つが開発の注目を集めるとすぐに大きくなります。そして、プロジェクトBがしばらく保留された場合、プロジェクトAのCへの変更はすぐにそれを壊します。

さらに悪いことに、以前のバージョンに更新しても、サブリポジトリをその時点の状態に復元することはできません。したがって、サブリポジトリに下位互換性のない変更を加えるとすぐに、古いバージョンは機能しなくなります。これにより、バージョン管理の有用性が大幅に低下します。それは分岐に問題を引き起こし、例えば二等分は機能しません。

これが、Cの最新バージョンに手動で更新し、すべてがまだ機能するかどうかをテストし、そのサブリポジトリの更新をチェックインする必要がある理由です。これにより、リポジトリバージョンをサブリポジトリバージョンに厳密にロックします。利便性を少し犠牲にしますが、コードの安定性が得られます。これがはるかに優れている理由を明確にできたと思います:)。

親リポジトリ内からサブリポジトリに透過的にコミットすることに関しては、私が知る限り、これを行う予定ですが、これまでのところ、誰も実際に実装していません。

于 2012-08-01T16:43:30.043 に答える