Git Submoduleを使うときに毎回ググっているので、各コマンドとその意味をまとめておく。
もしGit Submoduleの概要を知りたくてこの記事にたどり着いた方は、Git submodule の基礎が非常によくまとまっているので、そちらをご覧になってみてください。
参照したリファレンスはこちら。
https://git-scm.com/docs/git-submodule/2.36.0
add
-
.gitmodulesに新しいサブモジュールを追加する。 - デフォルトで後述する
initも同時に行われる。
コマンドの基本形は次の通り。
git submodule add <repository> [<path>]
init
-
.gitmodulesに書かれたサブモジュールを.git/configに登録する。 -
.git/configを変更するコマンドなので、ローカルリポジトリごとに行う必要がある。
コマンドの基本形は次の通り。
git submodule init [<path>…]
update
-
.git/configに登録されたサブモジュールをチェックアウトする。- どのコミットがチェックアウトされるかは
git ls-tree <tree-ish> [<path>…]で確認できる。- E.g.
git ls-tree main mySubmoduleA
- E.g.
- 現在チェックアウトされているコミットは
git submodule statusで確認できる。- もちろん、サブモジュール内で
git log -n 1をしてもよい。
- もちろん、サブモジュール内で
- どのコミットがチェックアウトされるかは
- updateは
.git/configに基づいて実行されるので、予めinitを行っておく必要がある。-
--initオプションを付けると、updateの実行前にinitをやってくれて便利。
-
- updateを行うと、
.git/modules/<submodule-path>が作成あるいは更新される。- 中にはサブモジュール用の
.gitフォルダが入っている。
- 中にはサブモジュール用の
コマンドの基本形は次の通り。
git submodule update --init [<path>…]
deinit
-
.git/configのサブモジュールの登録を削除する。- リポジトリからサブモジュールを削除するわけではない。
- よって
.git/modules/<path>の中身は削除されない。
サブモジュールの削除
サブモジュールを削除するには、通常のファイル削除と同じようにgit rmを使う。
git rm <submodule-path>
これは.gitフォルダ下にゴミを残すため、(例えば同じパスにサブモジュールを再追加したい場合など)必要に応じて手でゴミを削除してあげる必要がある。
参考: [git] submoduleの削除、再追加について
ローカルリポジトリからサブモジュールを完全に削除するには、次の通りコマンドを実行する。
git submodule deinit <path>
git rm <path>
rm -rf .git/modules/<path>
deinitする前にサブモジュールを消してしまった
deinitする前にgit rmやgit revertでサブモジュールを消してしまった場合には、deinitが通らなくなってしまう。
その場合、ローカルリポジトリからサブモジュールの痕跡を消し去るには、deinitがやっていることを手で実行する必要がある。
具体的には、.git/configをテキストエディタで開いて、該当する[submodule "<path>"]エントリを削除してあげればよい。