サブモジュール(Submodule)
「サブモジュール」とは、複数の「リポジトリー」を1つの「リポジトリー」で管理する仕組みです。「リポジトリー」の中に、別の「リポジトリー」を配置することができます。
「リポジトリー」は入れ子構造になります。
サブモジュールをどういう時に利用するか
関連性が強いプロジェクトが複数の「リポジトリー」で管理されている場合、「サブモジュール」を利用して「リポジトリー」を一括管理することができます。複数の「リポジトリー」を1つの「リポジトリー」として管理できるため、「リモートリポジトリー」をクローンする側も、個別に「リモートリポジトリー」をクローンする必要がありません。
複数のプロジェクトを1つのリポジトリーで管理している場合も、複数のリポジトリーに分割し、それらのリポジトリーを1つのリポジトリーとして管理できます。
またユーザーは、クローンする「リモートリポジトリー」を選択することもできるため、必要な「リモートリポジトリー」のみクローンすることで、クローン及びチェックアウトにかかる時間を節約できます。
もちろん、すべての「リモートリポジトリー」を一括してクローン及びチェックアウトすることも可能です。
スーパープロジェクトとサブモジュール
「リポジトリー」を入れ子にするということは、「リポジトリー」には親子関係が成立します。この時、別の「リポジトリー」を配置する「リポジトリー」のことを、「スーパープロジェクト(Super Project)」といいます。
一方、「リポジトリー」内に配置された「リポジトリー」のことを、「サブモジュール(Sub Module)」といいます。
リポジトリーの入れ子の入れ子
「サブモジュール」内にさらに別の「リポジトリー」を配置できます。上記のように、何重にも「リポジトリー」を入れ子にして配置することができます。
ただ、あまりやり過ぎると、管理が煩雑になり混乱の元になるため、注意してください。
入れ子構造の親子関係
上記のような「リポジトリー」の入れ子構造では、親子関係が以下のようになります。中央のリポジトリーは、一番上のリポジトリーから見ると「サブモジュール」になります。
一方、一番下のリポジトリーから見ると、中央のリポジトリーは「スーパープロジェクト」になります。
サブモジュールの特徴
「サブモジュール」の特徴です。リモートリポジトリー自身は入れ子にならない
「サブモジュール」を利用することで、複数の「リポジトリー」を1つのリポジトリーとして扱えますが、「リポジトリー」自身は入れ子になりません。あくまで「リモートリポジトリー」への参照が入れ子構造になるだけであって、「サブモジュール」として追加した「リポジトリー」の「リモートリポジトリー」の構造は変化しません。
別々に存在する「リモートリポジトリー」の関係を、「ローカルリポジトリー」内で入れ子構造で表現します。
ですので、あるリポジトリーで「サブモジュール」として追加された「リモートリポジトリー」を、ユーザーは気にすることなく従来通りクローンし、「ローカルリポジトリー」で作業することができます。
サブモジュールで行う作業は、サブモジュールのワーキングディレクトリーで行う
ファイルの編集やコミットなど「ワーキングディレクトリー」で行う作業は、それぞれの「ワーキングディレクトリー」で行います。「スーパープロジェクト」で行う作業は「スーパープロジェクト」の「ワーキングディレクトリー」で作業を行い、「サブモジュール」で行う作業は「サブモジュール」の「ワーキングディレクトリー」で作業を行います。
従ってコマンドを実行するカレントディレクトリーにある「ローカルリポジトリー」が現在の「ローカルリポジトリー」であり、操作対象の「ローカルリポジトリー」になります。
また、pullやfetch、push等の作業も同様に、それぞれの「ワーキングディレクトリー」でコマンドを実行します。