“git clone ~”を使ったソースが”git push”でGitLabに反映されない…

どうもこんにちは!

最近でGitを使う中で、これ何??

なんで、pushしても反映されないの??

リポジトリからたどれないのはどうして??

…となった、Git のsubmoduleっていう機能の紹介をしようと思います


案件の関係で、最近、他の人の作ったパッケージ・ライブラリを連れてきてコードを組んでいることが多くあったんですけど、

  • 引っ張ってきたコードがGitLabのリポジトリに反映されない
  • git pullで取得できない

…という問題が起きていました。

それで、調べてみていたんですけど、表記がgit submoduleのソレになっているんですね。

“git clone”して持ってきただけなのに。

表示はこんな感じ…
アイコンが変わって、[ディレクトリ名] @ [半角英数字]と表記される…

コードを引用してくると、サブモジュールという扱いになるようです…。ただ、サブモジュールとして引用してきているわけではないので、

サブモジュールの管理に必要な”.gitmodules”が作成されていない

=> 引用されてきているコードなのは確かだけれど、引用先の定義がない

という現象が起きていたようです。

対処方法としては、

  1. git rm -cached [ディレクトリPath]で、gitに登録されている該当ディレクトリのパス情報を削除
  2. ディレクトリ自体を消去
  3. git submodule add [git clone の時に使うURLなど] を実行する
  4. あとは、通常通り 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に移行するとうまくいかないことがある…ということを書いている記事もあったのですが、便利そうなので覚えておきたいなぁと思ってまとめておきました。

サブモジュールで取り込むときにブランチ・タグの指定もできたらいいんですけど…なかなか記事が見つからないですね…(´・ω・`)