Help us understand the problem. What is going on with this article?

git submoduleに対してのうわべっぽい理解

More than 5 years have passed since last update.

git submoduleとは

git submoduleとは、一言で言うとネストされたgitレポジトリです。たとえばあるレポジトリで使用しているライブラリについて、常に最新のライブラリを使用したいという場合、そのライブラリを自分のgitリポジトリに入れてしまって更新されるたびにpullするという使い方が考えられますね。

使い方(うわべ)

既存のレポジトリの中で、
git submodule add <repository's URL>
のコマンドを叩きます。イメージはcloneと一緒ですね。
該当ライブラリのver,branchを切り替えたいときは、そのディレクトリの中に入って、
git pullとかgit checkoutすればよいです。
そのあと、そこから出て、該当ディレクトリをadd,commitすればよい。
これが基本の使い方になります。かんたん!

ややこしいことがおこるとすれば

submoduleはついてこない

タイトルの通りです。たとえばsubmoduleが含まれているリポジトリをcloneしてきたとして、submoduleのディレクトリ内はからっぽになっています。おいおい、なんでやねんとなるポイントですね。
外側(大本のリポジトリ)とsubmoduleは厳密に連動しているわけではないので、このようなことが起こります。解決法としては、該当ディレクトリの中で、
git submodule initgit submodule updateとすれば、そのclone元で使ってたsubmoduleの参照先から引っ張ってきてくれます。
本家リポジトリのbranchを切り替えたりしたときもそうです。基本的にsubmoduleはついてきてくれないのでgit submmodule updateする必要があります。

要するに

  1. 追加はgit submodule add <URL>
  2. 困ったら中に入ってgit submodule update

うん、うわべっぽい。間違いありましたら指摘お願いいたします。

ちなみに

submodule内をいじくりまわすのはやめましょう。本家リポジトリをいじってそれをsubmodule内でpullするのが賢いっぽいです。

追記

ローカルのsubmoduleに変更加えてしまった場合。それが必要のない変更なら、submoduleディレクトリに入って、git resert --hardでどうにかなる。要するにそのcommitを無かったことにしてるだけだけど。危ないコマンドなので多用しない方がいいっぽい。

lastcat_
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away