git submodule 使い方

サブモジュールについて

サブモジュールは外部のリポジトリをソースツリーのサブディレクトリに埋め込むために使用する。

  • リモートリポジトリとは異なる(リモートリポジトリはソースツリーに埋め込めない)
  • 二つのプロジェクトのヒストリは完全に分かれている
  • サブモジュールに対しては編集できない
  • 外部リポジトリのヒストリを取り込みたい場合は、サブモジュールではなくsubtree merge strategy を使う
  • メインリポジトリはサブモジュールのリポジトリのあるコミットを参照している

サブモジュールを追加する

<git://example.com/repo.git> を サブモジュールとして追加するには

git submodule add git://example.com/repo.git
git submodule add git://example.com/repo.git DIR

とする。サブモジュールを保存するディレクトリは、必要に応じて指定する。 .gitmodules にパスと URL が保存される。

サブモジュールとしてブランチを加えるには「-b」でブランチを指定する。

git submodule add -b BRANCH git://example.com/repo.git

サブモジュールのステータスを表示する

ステータスを表示するには

git submodule status

または

git submodule

とする。

特定のサブモジュールだけを対象にするには、そのパスを指定する。

git submodule status path/to/submodule

サブモジュールが初期化されていない場合は先頭に「-」、 サブモジュールのコミットと メインリポジトリに記録されているコミットが一致しない場合は「+」がつく。

入れ子になったサブモジュールのステータスを表示するには「–recursive」、 HEAD ではなくインデックスを対象にするには「–cached」をつける。

git submodule status --recursive
git submodule status --cached

サブモジュールを初期化する

初期化されていないサブモジュールは

git submodule update

で更新されない。

各サブモジュールを初期化するには

git submodule init

とする。.gitmodules の中のサブモジュール名とその URL が .git/config に登録される。 指定したサブモジュールだけを初期化するにはパスを指定して

git submodule init path/to/submodule

とする。

登録されているサブモジュールを更新する

登録されている(git submodule init を実行した)サブモジュールを更新する (メインリポジトリに登録されているサブモジュールのコミットをチェックアウトする) には

git submodule update

とする。

また、「–init」オプションをつければ

git submodule init
git submodule update

を実行したことになる。

クローンしたリポジトリのサブモジュールをワークツリーに展開する

サブモジュールを含むリポジトリをクローンしたとき、 サブモジュールのディレクトリは空になっている。

git submodule status

を見ると先頭が「-」になっていて、サブモジュールが初期化されていないことがわかる。

git submodule init
git submodule update

とすると、サブモジュールの初期化と更新が実行される。 サブモジュールのディレクトリを見ると、実際にファイルが保存されている。

各サブモジュールのディレクトリでコマンドを実行する

git submodule foreach ls

とすると、各サブモジュールのディレクトリで ls を実行する。

$name で .gitmodules のサブモジュールセクションの名前、 $path でサブモジュールディレクトリの名前、 $sha1 でコミット、$toplevel で上位のプロジェクトの絶対パスを取得できる。

シェルだと「$」のエスケープが必要で

git submodule foreach echo \$name \$path \$sha1 \$toplevel

とするとそれぞれの値が表示される。

サブモジュールのコミットのサマリーを表示する

HEAD とサブモジュールのワークツリーの間のコミットを表示するには

git submodule summary
git submodule summary path/to/submodule

とする。特定のサブモジュールだけを対象とするにはそのパスを指定する。

また、対象となるコミットを指定して

git submodule summary HEAD~10

などとすることもできる。

ローカルのリポジトリからオブジェクトを借りるようにサブモジュールを設定する

git submodule に git clone と同じ「–reference」オプションがある。

git submodule add --reference /path/to/local_repo git://example.com/repo.git

とすると git clone と同様にローカルリポジトリを参照したサブモジュールができる。

git clone と同様にオブジェクトを借りたリポジトリにおいて オブジェクトを削除するとリポジトリが壊れるので注意が必要。

参考

  • man git-submodule

Tags of current page