Gitのサブモジュール(submodules)は、外部のGitリポジトリを現在のリポジトリのサブディレクトリに組み込むための仕組み。これにより、外部のプロジェクトやライブラリを現在のプロジェクト内で使うことができる。

  1. サブモジュールは、親プロジェクトから独立している。つまり、親プロジェクトをクローンしたときにサブモジュールは自動的にはクローンされない。これを行うためには git clone --recursive <project> を使用する必要がある。
  2. サブモジュールの更新は、親プロジェクトの更新とは独立して行われる。したがって、サブモジュールの最新の変更を取得するには、サブモジュールディレクトリに移動してから git pull を実行する必要がある。
  3. サブモジュールのリポジトリのコミットを変更すると、親プロジェクトのサブモジュール参照も更新する必要がある。それを行わずに親プロジェクトをコミットすると、親プロジェクトは古いサブモジュールのリビジョンを参照したままになる。

ユースケース

Gitのサブモジュールは、以下のような場合に使用する。

  1. 外部のライブラリやプロジェクトを、自分のプロジェクトに組み込むとき。そのライブラリが更新されても自分のプロジェクトに影響を及ぼさないようにするため、サブモジュールとして組み込むことが一般的
  2. 一つの大きなプロジェクトを、複数の小さなリポジトリに分割して管理したいとき。サブモジュールを使えば、それぞれ独立に開発を進めることができ、それらを一つの親プロジェクトで統合することができる

コマンドの例

サブモジュールの追

git submodule add <repository> [<path>]

はサブモジュールとして追加したいGitリポジトリのURLで、はそのサブモジュールを配置したいローカルのパス。` を省略した場合、デフォルトではリポジトリ名がそのままパスとして使用される。

サブモジュールを含むリポジトリのクローン

git clone --recursive <repository>

--recursive オプションを使用すると、サブモジュールも自動的にクローンされる。省略すると、サブモジュールのディレクトリは空のままになる。

既存のリポジトリにサブモジュールを初期化または更新

git submodule initgit submodule updateまたは git submodule update --init --recursive

git submodule init はサブモジュールの初期化を行い、 git submodule update はサブモジュールをそのリポジトリの指定されたコミットに更新する。 --recursive オプションを使用すると、ネストしたサブモジュールも同様に初期化/更新されます。

サブモジュールを最新のコミットに更新

git submodule update --remote [--merge]

--remote オプションを使用すると、各サブモジュールがそのリモートリポジトリの最新のコミットを指すようになる。 --merge オプションを使用すると、その更新が現在のブランチに自動的にマージされる。

サブモジュールの削除

サブモジュールを削除するには、 .gitmodules ファイルから該当のエントリを削除し、Gitの設定からサブモジュールに関連する情報を削除し、最後にサブモジュールのディレクトリ自体を削除する。

Submoduleを更新する場合