Git Submodules: 外部リポジトリを取り込む

git submodule を使ってプロジェクト内に外部リポジトリを含めて管理する方法を解説。サブモジュールの追加・更新・削除の手順を紹介します。

git submodule add https://github.com/lib/repo.git vendor/lib

詳細な説明

Git Submodules とは?

サブモジュールは、別の Git リポジトリの中に埋め込まれた Git リポジトリです。親リポジトリはサブモジュールのファイルを直接保存するのではなく、特定のコミットへの参照を保存します。これにより、ピン留めされたバージョンの外部依存関係を含めることができます。

サブモジュールの追加

git submodule add https://github.com/lib/repo.git vendor/lib
git commit -m "Add lib as submodule"

これにより .gitmodules ファイルが作成され、サブモジュールのコミットハッシュが記録されます。

サブモジュール付きリポジトリのクローン

# クローンとサブモジュールの初期化を一度に行う
git clone --recurse-submodules https://github.com/user/project.git

# またはクローン後に初期化
git submodule init
git submodule update

サブモジュールの更新

# サブモジュールの追跡ブランチの最新コミットに更新
cd vendor/lib
git pull origin main
cd ../..
git add vendor/lib
git commit -m "Update lib submodule"

# またはすべてのサブモジュールを一度に更新
git submodule update --remote

サブモジュールの削除

git submodule deinit vendor/lib
git rm vendor/lib
rm -rf .git/modules/vendor/lib
git commit -m "Remove lib submodule"

よくある落とし穴

  • クローン時に --recurse-submodules を忘れると、サブモジュールのディレクトリが空になる。
  • サブモジュールの更新には親リポジトリでのコミットが必要(新しいハッシュを記録するため)。
  • サブモジュール参照のマージコンフリクトは混乱しやすい。

代替手段

多くのプロジェクトでは、パッケージマネージャー(npm、pip、cargo)の方がサブモジュールよりシンプルです。サブモジュールは、パッケージマネージャーのない依存関係の特定のコミットをピン留めする必要がある場合や、依存関係にローカルな変更を加える必要がある場合に検討してください。

ユースケース

企業が共有 UI コンポーネントライブラリを別リポジトリとして管理し、複数のプロダクトリポジトリにサブモジュールとして含めることでバージョンの一貫性を保つ場面で使用します。

Try It — Git Command Builder

フルツールを開く