初めまして濱田と申します。
こちらでブログを投稿させていただくのはこれが初めてです!
これからどうぞよろしくお願い致します。
さて早速本題に入らせていただきます。
先日参画したプロジェクトでgit submoduleに触れる機会があったので
その時に学んだ使い方をいくつかご紹介しようと思います。
はじめに
え?待って…そもそもgit submoduleって何…?
初めて聞いたんですけど…
早速出鼻をくじかれたので調べます。
外部の git リポジトリを、自分の git リポジトリのサブディレクトリとして登録し、特定の commit を参照する仕組みです。
ふむふむ。よくわからん。
今考えてみるとそんなに難しいことはなかったのですが当初の私は意味が分かりませんでした。
先に結論
まず結論から言ってしまうと
自分が使っているメインのリポジトリに別のディレクトリが掘られて、その中に別のリポジトリをチェックアウトするっていう具合でした。
つまり外から見ると一つのリポジトリに複数のリポジトリが親子関係を持って共存しているように見えるわけですね。
早速git submoduleを使ってみる
ひとまず習うより慣れろということでいろいろ叩いた方が分かりやすそう。
私が触ったgit submoduleのコマンドを一通りご紹介します。
まず外部のリポジトリをsubmoduleとしてチェックアウトしてくる場合は、下記のコマンドを叩きます。
$ git submodule add <チェックアウトしたいリポジトリのURL> <チェックアウトしたいリポジトリのブランチ名>
こちらのコマンドを叩くと今いる階層に対象のリポジトリがクローンされて、コマンドで指定したブランチがチェックアウトされます。
え?これだけ?意外と簡単じゃん!
この時git submodule addでsubmoduleを登録したリポジトリ側からは一つのファイルとして見えて
その中にどのコミットハッシュをチェックアウトしたかなどの情報を持っています。
最初に自分でgit submodule addしたリポジトリはちゃんとgit checkoutコマンドでブランチやタグを切り替えたり、git pull、git pushなどのコマンドで普通に一つのリポジトリを使うイメージで使用するのと何ら変わりありません。
そう…「最初に自分でgit submodule addしたリポジトリ」は…
何となくお気づきの方もいると思いますが
ここまでの説明は自分でリポジトリをsubmoduleとして登録する場合の手順です。
誰か別の作業者がgit submodule addしたリポジトリを取得したい場合はどうするのでしょうか?
私は初めこれがなかなか分からず誤ってgit submodule addして
リポジトリが変な状態になって何回リポジトリをクローンし直したことか…
他の人がgit submodule addしたリポジトリを自分のリポジトリにも反映する
ここも結論から言うとこの場合には
submoduleが登録されているリモートブランチなどをチェックアウトした状態で
git pull --recurse-submodules
もしくは、
git submodule update --init --recursive
このコマンドを実行するとメイン側のリポジトリでチェックアウトしているブランチに登録されているsubmoduleが取得できます。
この結論にたどり着くまでに結構な時間を使ってしまった…
まとめ
ここまで記載したコマンドを用途別にまとめます。
・新規にsubmoduleを登録
$ git submodule add <チェックアウトしたいリポジトリのURL> <チェックアウトしたいリポジトリのブランチ名、タグ名など>
・登録しているsubmoduleのブランチの切り替え(普通にブランチのチェックアウトなどと同様)
$ cd <submoduleのディレクトリ>
$ git checkout <チェックアウトしたいブランチ名、タグ名など>
$ cd ..
$ git add # submoduleを登録した側のリポジトリの変更としてaddする!
・別の作業者が登録したsubmoduleの取得方法
git pull --recurse-submodules
もしくは
git submodule update --init --recursive
↑必ずsubmoduleが登録されているコミットブランチをチェックアウトした状態で行ってください。
上記のコマンドを理解しておけば基本的に普通にgitを使用するのと大差ないですね。
というわけで今回はgit submoduleに関して書いてみました。
初めてのブログ投稿だったので何かと至らない点があるかもしれませんがどうかそこは大目に見ていただいて…
それではまた!