はじめに
いろんなリポジトリを見ていたら .gitmodules というファイルを見つけました。
名前から Git 関連のファイルなのでしょうが、使用用途はいったいなんなのでしょうか。
.gitmodules とは何か
調べたところ、これは Git submodule(サブモジュール)用の設定ファイルだったようです。
.gitmodules には、サブモジュールの配置場所と参照先リポジトリが記録されます。
例としては以下のようになっています。
[submodule "libs/lib"]
path = libs/lib
url = https://github.com/example/lib.git
このファイルがあることで、他の人がリポジトリをクローンした際にも、同じ submodule 構成を再現できるようになるそうです。
そもそも submodule とは
submodule は、別の Git リポジトリを、自分のリポジトリの一部として取り込む仕組みです。
例えば以下のような構成があったとします。
example-project/
├── src/
├── libs/
│ └── common-lib
│ └── 色々なファイル
そのとき common-lib が独立した別のリポジトリであったなら、以下のコマンドを使って submodule を追加します。
git submodule add https://github.com/example/common-lib.git libs/common-lib
ではクローンしたときはどうすればいい?
リポジトリをクローンしたら、中に submodule が含まれていることがあります。
この場合、普通にクローンしただけでは中身を使うことができません。
先ほどの例で考えましょう。
クローン直後のフォルダ構成は以下のように空っぽのファイルが生成されます。
example-project/
├── src/
├── libs/
│ └── common-lib (そもそもファイルの中身がない。)
そのため、以下のコマンドを使用して submodule を取得しましょう。
なお、 --recursive を使うことによってネストされたサブモジュールも再帰的に取得します。
git submodule update --init --recursive
これをすることによってようやく全て完了するというわけです。