Git を使っていると、自分で作ったリポジトリの中で、別のリポジトリを入れたい時があるかと思います。
僕の場合は、Vim の設定ファイルやプラグイン管理用にディレクトリを作って、 GitHub で管理しようと思った時に、プラグインに関しては、外部のリポジトリと同期させる必要がありました。
が、例えば、hoge
っていうリポジトリがあるとして、その中で、fuga
っていうリポジトリを外部から$ git clone
してきた場合hoge
を$git push
しても、fuga
の中身はpushされません。
困ったなーって思ってたら見つけたのが submodule という機能!
具体的には、リポジトリ内の外部リポジトリを取り込みたいディレクトリで、
$ git submodule add [外部リポジトリ] [ローカルで格納したいディレクトリ]
すれば、サブモジュールが作成できます。
ポイントとしては、サブモジュールの中と外は連動しておらず、外側から見るとサブモジュールは、外部リポジトリが入っている箱でしかないという点です。
なので、サブモジュールを更新したり別のブランチを使ったりしたい場合は、サブモジュールの中に入って、git 操作を行います。
ちなみに、別のマシンでhoge
を$ git pull
する場合、それだけではfuga
の中身は引っ張ってこれません。
fuga
の中身を引っ張ってくるには、pull した後に、$ git submodule init
して、$ git submodule update
するとfuga
が参照してるリポジトリからクローンされます。
ここで、自分の場合は、No submodule mapping found in .gitmodules for path 〜
というエラーが出て最初はうまく行かなかったのですが、原因はサブモジュールを管理する.gitmodules
というファイルの中での記述に問題があったからのようでした。
.gitmodules
の中には、サブモジュールへのパスや、参照しているリポジトリの情報が書いてあるのですが、そのパスが、フルパスだと何故か認識されておらず相対パスに書き換えるとうまく行きました。
ということで、今回の参考ブログは以下!
Git submodule の基礎 | Qiita / sotarok
git submodule ではまった | ryusunslifestyle