TortoiseHg2.1.3およびHg1.9.2を使用します。私が何をしても、親リポジトリは、最初にサブリポジトリでコミットしない限り、サブリポジトリで作成された新しいファイルを認識しません。すべてのコミットとプッシュは親リポジトリでのみ実行されることになっていると思いましたか?
3 に答える
さらにテストしたところ、サブリポジトリ内のファイルへの変更はコミットされていましたが、新しいファイルはコミットされていませんでした。これは、コミットがデフォルトでサブリポジトリを認識し、再帰的であるという事実によるものですが、hgadd操作はそうではありません。サブリポジトリを検討するには、hgaddに--subrepoフックを追加する必要があります。
いいえ。Mercurialは、親が変更をプルする前に、サブリポジトリにコミットされている変更を要求します。サブリポジトリが変更をコミットするまで、親にプッシュされる既存の変更セットはありません。
また、サブリポジトリが作成されてから統合された新しいチェンジセットをプルダウンし、Mercurialが新しいチェンジセットをプッシュアップできるようになる前に、それらを変更とマージするように求められる可能性があります。
これが起こっていることです。
サブリポジトリ内のファイルのみを変更するとします。これは説明に役立ちます。
親リポジトリとサブリポジトリの唯一の関係は、親リポジトリがサブリポジトリを含むフォルダを持っていることを認識しており、サブリポジトリが想定されているチェンジセットを認識していることです。この情報は追跡されます。つまり、親リポジトリのバージョンが異なれば、サブリポジトリも異なるか、サブリポジトリ内の異なるチェンジセットを参照する可能性があります。
この情報は通常のファイルに保存されるため、変更の検出などに関する通常のルールがすべて適用されます。ファイルの内容が作業フォルダーの親チェンジセットと同じである場合、それらのファイルに変更はありません。
このメカニズムにより、親リポジトリ内の古いチェンジセットに更新し直し、親リポジトリ内のチェンジセットがコミットされたときと同じように、それぞれのチェンジセットへのサブリポジトリを再帰的に更新(および追加または削除)することができます。これは、この情報を追跡するファイルを調べ、この知識をサブリポジトリに再帰的に適用するだけで実行されます。
そのため、サブリポジトリ内のファイルを変更し、親リポジトリにコミットするように依頼します。ただし、サブリポジトリのリストを変更しておらず、サブリポジトリが現在参照しているチェンジセットも変更していません。サブリポジトリの作業フォルダでの変更は考慮されません。
そのため、親リポジトリには変更がないため、コミットできません。
一方、最初にサブリポジトリでコミットした場合、そのリポジトリは作業フォルダの親として新しいチェンジセットを参照しています。
次に、親リポジトリでコミットすると、サブリポジトリ追跡コードはサブリポジトリでこの新しい変更セットを確認し、親リポジトリでこの情報を追跡するファイルを更新します。その後、コミットする変更があります。