どうもこんにちは!
最近でGitを使う中で、これ何??
なんで、pushしても反映されないの??
リポジトリからたどれないのはどうして??
…となった、Git のsubmoduleっていう機能の紹介をしようと思います
案件の関係で、最近、他の人の作ったパッケージ・ライブラリを連れてきてコードを組んでいることが多くあったんですけど、
- 引っ張ってきたコードがGitLabのリポジトリに反映されない
- git pullで取得できない
…という問題が起きていました。
それで、調べてみていたんですけど、表記がgit submodule
のソレになっているんですね。
“git clone”して持ってきただけなのに。
コードを引用してくると、サブモジュールという扱いになるようです…。ただ、サブモジュールとして引用してきているわけではないので、
サブモジュールの管理に必要な”.gitmodules”が作成されていない
=> 引用されてきているコードなのは確かだけれど、引用先の定義がない
という現象が起きていたようです。
対処方法としては、
git rm -cached [ディレクトリPath]
で、gitに登録されている該当ディレクトリのパス情報を削除- ディレクトリ自体を消去
git submodule add [git clone の時に使うURLなど]
を実行する- あとは、通常通り commit & push
そもそも、git clone
ではなくgit submodule add
を使っていれば、こんなことにはならなかったんですね。おそらく。
pullするときは、下の2つのどちらかを実行すると引用コードを一度に取得できるようです!
git clone --recursive {gitリポジトリurl}
というように、--recursive
をつけてcloneを実行するgit clone {gitリポジトリurl}
=>git submodule update --init --recursive
今回はただただ、なんだコレ?という状態で困ったんですけど、
submodule自体は便利な機能で、登録しておくと、引用元の変更があったときにそれを簡単に反映できるというメリットがあるようです。
ディレクトリパスの表記の関係上、Linux系で設定した.gitmodulesでwindowsに反映はできるけれど、windowsからLinuxに移行するとうまくいかないことがある…ということを書いている記事もあったのですが、便利そうなので覚えておきたいなぁと思ってまとめておきました。
サブモジュールで取り込むときにブランチ・タグの指定もできたらいいんですけど…なかなか記事が見つからないですね…(´・ω・`)