あちこち情報があるけど、たまに使うコマンドのメモ
git clone --recursive 親プロジェクト.git
git submodule update --init --recursive
git submodule foreach --recursive "git pull origin main"
あたりを覚えておけば良さそう。
submoduleはブランチでなくコミット単位で保存され、git pullでは更新されないので扱いに注意が必要。
最初にやること
すでにsubmoduleで管理されているプロジェクトをcloneしたものとする。
git clone --recursive 親プロジェクト.git
-
git clone 親プロジェクト.git
と普通に持ってきても以下のコマンドでsubmoduleを更新できる。 - git cloneで--recursiveを忘れた時は以下と同じく
git submodule update --init --recursive
で取得できる。
親プロジェクトのsubmoduleを取得、更新
- 管理しているsubmoduleを取得(決まったcommit idのものが取得される)
- git pullするときに合わせて行うとよい。
cd 親プロジェクトのパス
git pull
git submodule update --init --recursive
Git LFSを使っていたら
cd 親プロジェクトのパス
git lfs pull
git submodule foreach --recursive "git lfs pull"
修正したらやること
基本的にはsubmoduleでcommit,pushしたあと、親プロジェクトでcommit,pushすれば良い。
submoduleの修正(local -> remote)
- 普通にsubmoduleのフォルダで編集、git操作(commitしてpush、ここでは"main"ブランチを更新したとする)
cd submoduleのパス
git commit -a -m"update submodule contents"
親プロジェクトのsubmoduleを更新(local -> remote)
- 普通にcommit、pushすると、他の人も同じ環境を使えるようになる
cd 親プロジェクトのパス
git commit -a -m"update commit id of submodule"
親プロジェクトのsubmoduleを一括更新(local)
- submoduleで管理しているgitリポジトリの特定ブランチ("main")の最新版に一括取得
- ブランチ名が違うと一括更新できないので一つづつ行う必要がある。
- 利用するsubmoduleのブランチ名を合わせておいた方が便利。
- 親プロジェクトで管理しているsubmoduleを一括で変更するときなどに使う。
- --recursiveしているので、全部のsubmoduleを把握していないと意図せずupdateされてしまう。
cd 親プロジェクトのパス
git submodule foreach --recursive "git pull origin main"