Git Submodule の基本から応用まで - 共有と更新をマスターする


利点

  • 大規模なコードベースをより扱いやすくする
  • サブモジュールの更新を簡単に追跡および管理
  • プロジェクト間の依存関係を明確にする
  • コードの重複を削減

仕組み

  1. サブモジュールの追加
    親リポジトリにサブモジュールを追加するには、git submodule add コマンドを使用します。 以下の例では、https://github.com/user/submodule リポジトリを submodule-dir ディレクトリにサブモジュールとして追加します。
git submodule add https://github.com/user/submodule submodule-dir
  1. サブモジュールの更新
    サブモジュールの最新コミットを取得するには、git submodule update コマンドを使用します。
git submodule update
  1. サブモジュールのコミット
    サブモジュールの変更を親リポジトリにコミットするには、通常の git addgit commit コマンドを使用します。
git add submodule-dir
git commit -m "Submodule changes"
  • サブモジュールのネストはサポートされていますが、複雑になる可能性があるため、避けたほうがよい場合があります。
  • サブモジュールの変更を親リポジトリにコミットする前に、必ず git submodule update を実行して最新の状態を取得してください。
  • サブモジュールは、Git リポジトリのスナップショットのみを保存します。 サブモジュールの最新コミットを取得するには、git submodule update コマンドを定期的に実行する必要があります。


サブモジュールの追加

# 親リポジトリでサブモジュールを追加
git submodule add https://github.com/user/submodule-repo submodule-dir

このコマンドは、https://github.com/user/submodule-repo リポジトリを submodule-dir ディレクトリにサブモジュールとして追加します。

サブモジュールの更新

# 親リポジトリでサブモジュールの最新コミットを取得
git submodule update

このコマンドは、サブモジュールのディレクトリに移動し、最新コミットを取得します。

サブモジュールの変更をコミット

# サブモジュールディレクトリに移動
cd submodule-dir

# サブモジュールの変更を加え、コミット
git add .
git commit -m "Submodule changes"

# 親リポジトリに戻り、変更をコミット
cd ..
git add submodule-dir
git commit -m "Submodule commit"

この一連のコマンドは、まずサブモジュールディレクトリに移動し、サブモジュールの変更をコミットします。 その後、親リポジトリに戻り、サブモジュールのディレクトリとコミットメッセージを追加して、親リポジトリのコミットを行います。

サブモジュールのバージョン指定

特定のコミットバージョンにサブモジュールを固定したい場合は、git submodule add コマンドに -b オプションを使用します。

git submodule add -b master https://github.com/user/submodule-repo submodule-dir

このコマンドは、サブモジュールの master ブランチを submodule-dir ディレクトリにチェックアウトします。

サブモジュールの初期化解除と削除

サブモジュールを初期化解除して削除するには、以下のコマンドを使用します。

git submodule deinit --force submodule-dir
git rm -rf submodule-dir

この一連のコマンドは、まずサブモジュールの初期化を解除し、次にサブモジュールディレクトリを削除します。



  • 大きなリポジトリ
    サブモジュール全体が親リポジトリに含まれるため、リポジトリサイズが大きくなる可能性があります。
  • 更新の煩雑さ
    サブモジュールの更新には、git submodule update コマンドを手動で実行する必要があります。
  • 複雑性
    サブモジュールのネストや、複数ブランチの追跡は複雑になる可能性があります。

これらの理由から、Git Submodule の代替方法を検討することがあります。 以下に、いくつかの代替方法を紹介します。

Git Subtree

Git Subtree は、Git Submodule と同様の機能を提供しますが、よりシンプルで軽量です。 Submodule をネストしたり、複数ブランチを追跡したりすることができ、親リポジトリにサブモジュールの内容を直接コミットできます。

git subtree add --prefix submodule-dir https://github.com/user/submodule-repo master

Composer (PHP)

Composer は、PHP プロジェクトの依存関係を管理するためのツールです。 サブモジュールを使用する代わりに、Composer で依存関係を宣言して管理することができます。

composer require vendor/package

npm (Node.js)

npm は、Node.js プロジェクトの依存関係を管理するためのツールです。 サブモジュールを使用する代わりに、npm で依存関係を宣言して管理することができます。

npm install package

Maven (Java)

Maven は、Java プロジェクトの依存関係とビルドプロセスを管理するためのツールです。 サブモジュールを使用する代わりに、Maven で依存関係を宣言して管理することができます。

<dependency>
  <groupId>groupId</groupId>
  <artifactId>artifactId</artifactId>
  <version>version</version>
</dependency>

最適な代替方法は、プロジェクトのニーズによって異なります。

  • より複雑な依存関係やワークフローを必要とする場合は、Git Submodule を引き続き使用できますが、その複雑性と制限を認識する必要があります。
  • PHP、Node.js、Javaなどの言語を使用している場合は、言語固有の依存関係管理ツール (Composer、npm、Maven など) を検討してください。
  • コードの共有と依存関係の管理がシンプルな場合は、Git Subtree が良い選択肢です。

上記以外にも、GNU Stow や Mercurial の hg subrepo など、Git Submodule の代替となるツールがいくつかあります。