「ふたつのプロジェクトはそれぞれ別のものとして管理したい。だけど、一方を他方の一部としても使いたい」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
などして希望のブランチに変更するのが良いと思います。