個人的備忘録です。
git submodule とは
乱暴に言うと、あるリポジトリのサブディレクトリ配下に 別のリポジトリ(プロジェクト) を取り込み、そのまま管理するというもの。
どこで使うの
たとえば static site generator である Hugo でテーマ(スキン)。
テーマそれぞれが git リポジトリになっていて、それを hugo の site配下で themes/ の下に持ってくる必要がある。
$ cd themes
$ git clone テーマ.git
一見これでも問題はない。でも、たとえば netlify を使うことになると、このhugoのsite以下をgitで管理する必要が出てくる。じゃあ、その中にあるthemesにどうやって持ってくるのか? そこでsubmoduleの出番になってくる。
小さな落とし穴
$ git submodule add サブモジュールとしてチェックアウトしたいなんとか.git
こうすると、とりあえずうまくいく。ファイルもばっちり取り出されている。これを、git addしてcommitしてpushして...
別のマシンなり環境なりで、この全体を git clone する。と、サブモジュールとしたディレクトリ配下が空っぽである。
あれ!?pushしたんじゃなかったの?
対策
のちに取り出した方の環境ではサブモジュールが有効になっておらず取り出せてもいない。詳細は割愛する。(.gitmodulesとかなんとか調べてください)
$ git submodule init
$ git submodule update
とするか、そもそも
$ git clone --recursive 自分のリポジトリ
とすれば良い。
余談
netlify で hugo なサイトを回している感じでは、clone --recursive されているようだ。実際チュートリアルにも submodule でやれよみたいなこと書いてあるし。
余談2
git submodule 「なにがどうなっているのか」を完全に理解しない限り奇妙に見える(たとえばcommit idに紐付いているとか) が、使う分にはすこぶる快適なのでオススメ
参照
- Hugo (https://gohugo.io/)
- netlify (https://www.netlify.com/)