gitのsubmoduleをちょっと調べてみた

April 01, 2014

「ふたつのプロジェクトはそれぞれ別のものとして管理したい。だけど、一方を他方の一部としても使いたい」Git - サブモジュールの冒頭にこうありました。まさにこれがしたいと思っていたのでちょっと手を動かしてみました。今まで避けていたので。。

サブモジュールとは

サブモジュールとは主な管理対象(管理対象A)に別のgit管理対象(管理対象B)を追加することです。ただし、管理対象Bの中身までは管理しません。あくまでも、管理対象Bの特定のコミットを記録するだけです。

空白ページ

サブモジュールの追加

$ git submodule add git://github.com/chneukirchen/rack.git rack

これを行うと、.gitsubmodulesと、rackがAの管理対象に追加される。

$ cat .gitmodules [submodule “rack”] path = rack url = git://github.com/chneukirchen/rack.git

.gitsubmodulesの中身はこんな感じ。rackに関しては単にcommitの番号が記録されている。

diff —git a/rack b/rack new file mode 160000 index 0000000..08d709f --- /dev/null +++ b/rack @@ -0,0 +1 @@ +Subproject commit 08d709f78b8c5b0fbeb7821e37fa53e69afcf433

サブモジュールの更新

rack(B)の中身をコミットしても、親(A)が参照しているBのコミット番号は変わらない。Aでも下記のようにして更新する必要がある。

$ git add . $ git commit -m “update B” $ git push

サブモジュールのクローン

サブモジュールを含むプロジェクトをクローンする場合、サブモジュールのディレクトリはクローンされるが中身は空である。サブモジュールを取得するために、

$ git submodule init $ git submodule update

をする必要がある。こうすると、サブモジュールがクローンされる。

ただ、クローンされたサブモジュールのbranchは(no branch)となっているので、サブモジュールを変更したいときには、サブモジュールのディレクトリ内でgit checkout masterなどして希望のブランチに変更するのが良いと思います。

参考