スーパープロジェクトの役割
「スーパープロジェクト」の役割は、「サブモジュール」の状態の管理です。サブモジュールの管理
「サブモジュール」がどの「リモートリポジトリー」と関連付けられているのか、「サブモジュール」がどのような状態になっているのか、などを管理します。例えば、「.gitmodules」ファイルはその一例です。
「git status」コマンドによる「サブモジュール」の状態表示もその一例です。
また、「サブモジュール」の追加や削除も「スーパープロジェクト」の役割です。
サブモジュールのクローンを行う
「サブモジュール」の「リモートリポジトリー」を「ローカルリポジトリー」にクローンするのは、「スーパープロジェクト」の役割です。「サブモジュール」の「リモートリポジトリー」のクローンは、自動的には行われません。
ユーザーは必要に応じて、「サブモジュール」の一部もしくは全てを、クローンする必要があります。
どの「リモートリポジトリー」をクローンすればよいかは「スーパープロジェクト」が把握しているため、クローンの実行は簡単です。
サブモジュールのコミット管理
「スーパープロジェクト」は「サブモジュール」のコミット状況も管理しており、どの「コミットオブジェクト」から「サブモジュール」のプロジェクトのファイル群をチェックアウトすればよいのかを管理しています。コミットID
この「コミットオブジェクト」を識別する情報を「コミットID」といいます。「コミットID」は「サブモジュール」ごとに存在し、「スーパープロジェクト」で管理する情報です。
「コミットID」は、ある特定の「コミットオブジェクト」を指します。
コミットIDの役割
「コミットID」は、「スーパープロジェクト」が「サブモジュール」の「リモートブランチ」をクローンする時など、「スーパープロジェクト」が「サブモジュール」をチェックアウトする時に使用されます。「コミットID」が指す「コミットオブジェクト」からプロジェクトのファイル群が、「サブモジュール」の「ワーキングディレクトリー」に展開されます。
コミットIDとHEAD
「コミットID」は、「サブモジュール」の「HEAD」とは別の管理になります。従って「サブモジュール」でコミット行っても、「スーパープロジェクト」が管理する「サブモジュール」の「コミットID」は更新されません。
この点は注意が必要です。
「サブモジュール」でコミットを行った際、ユーザーは必要に応じて「コミットID」を更新し、「サブモジュール」の「HEAD」が指す「コミットオブジェクト」の識別子を「コミットID」に設定する必要があります。
「サブモジュール」の「HEAD」相当の情報を、「スーパープロジェクト」が個別に管理しているイメージでしょうか。
コミットIDを更新するには
「コミットID」を更新する方法です。1.コミットIDの状態
現在「サブモジュール」の「コミットID」は以下のようになっています。2.サブモジュールで作業する
「サブモジュール」で作業を行い、「サブモジュール」でコミットを行いました。3.ワーキングディレクトリーの状態
「スーパープロジェクト」の「ワーキングディレクトリー」の状態を確認すると、以下のように「サブモジュール」でコミットが行われ、「コミットID」が指す「コミットオブジェクト」と「サブモジュール」の「HEAD」が指す「コミットオブジェクト」が異なっていることが分かります。4.コミットIDの状態
現在「サブモジュール」の「コミットID」は以下のようになっています。5.コミットIDの更新準備
「スーパープロジェクト」で「ステージングエリア」に「サブモジュール」を追加します。これで「コミットID」更新準備は完了です。