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>"]
エントリを削除してあげればよい。