Git Submodule を用いた共有と更新


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 リポジトリのスナップショットのみを保存します。 サブモジュールの最新コミットを取得するには、git submodule update コマンドを定期的に実行する必要があります。
  • サブモジュールの変更を親リポジトリにコミットする前に、必ず 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 install package

Maven (Java)

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

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

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

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