5

複数のサブリポジトリを含むMercurialリポジトリがあります。リポジトリには、リポジトリとサブリポジトリ内のプロジェクトを含むVisualStudioソリューションがあります。

リポジトリ内のメインプロジェクトへの変更と、ソリューション内の依存関係プロジェクトの1つへの変更を必要とする新しい機能を実装したいとします(たとえば、依存関係に新しい共有インターフェイスを追加し、メインプロジェクト)。

次に、変更をコミットしたいのですが、未完成で後でマージされるため、新しい名前のブランチにコミットします。tortoiseHgを使用して、作成する新しいブランチを指定して、リポジトリ内の変更をコミットします。次に、コミットはサブリポジトリの変更をコミットしますが、私のテストでは、リポジトリに新しいブランチを作成せず、現在のブランチに変更セットを追加するだけです。

サブリポジトリへのコミットを明示的に実行し、その時点でブランチ名を指定できますが、リポジトリ全体の変更セット全体を一度に各リポジトリの新しいブランチにコミットして、ワークフローをよりクリーンにする方法を望んでいました。これは可能ですか?

4

1 に答える 1

6

最初にサブリポジトリをコミットし、そこに名前付きブランチを作成します。

その後、メインコミットは、以前と同じブランチ内のそのサブリポジトリにコミットし続ける必要があります。

まず、2つのリポジトリを別々の完全に別々のものと考える必要があります。つまり、1つのリポジトリで何かを実行し、それをコミットします。次に、他のリポジトリで何かを実行し、それをコミットします。

2つのリポジトリの関係は、メインリポジトリにファイル(.hgsubstateファイル)が格納されていることです。このファイルには、各サブリポジトリの作業フォルダの親のハッシュが含まれています。

言い換えれば、サブリポジトリ自体は、それが全体像の一部であるという知識を持っていません。ただし、メインリポジトリは、そのサブリポジトリで現在チェックアウトされているリビジョンを認識しています。この知識は、通常のコミットの一部としてリポジトリにコミットされます。

これは、サブリポジトリで何かを実行した場合、それをコミットすると、サブリポジトリが新しいリビジョンになったことを意味します。後でメインリポジトリでコミットすると、サブリポジトリ内のその新しいリビジョンのハッシュが.hgsubstateファイルに更新されてから、コミットされます。

もちろん、この背後にある目的は、メインリポジトリ内の古いリビジョンに更新すると、.hgsubstateファイルの古いコピーも作業フォルダーに移動され、サブリポジトリがそのリビジョンに更新されることです。これは、これらのリビジョンが機能しているときにサブリポジトリがどのように表示されたかにクロックを戻す効果があります。

さらに、メインリポジトリのコマンドは、サブリポジトリでも機能する場合があります。メインリポジトリをプッシュすると、サブリポジトリもプッシュされ、メインリポジトリのクローンを作成する他のユーザーも、サブリポジトリの適切なコンテンツのクローンを作成できることに安全に依存できるようになります。

だからコメントであなたの質問に答えるために。

名前付きまたはその他の方法でサブリポジトリにブランチを作成すると、そのブランチに新しいチェンジセットをコミットし続けます。ある時点でマージする必要があり、メインリポジトリだけでなくサブリポジトリでもマージする必要があります。

まず、サブリポジトリにマージします。これはコミットで終了します。つまり、サブリポジトリはマージをコミットしたチェンジセットにあります。次に、メインリポジトリにマージしてコミットします。これにより、現在使用されているサブリポジトリの変更セットである知識が保存されます。

そうです、後で両方をマージする必要があります。

于 2010-11-17T13:40:44.577 に答える