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