LoginSignup
15
11

More than 1 year has passed since last update.

Git Submodule 覚え書き

Posted at

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
    • 現在チェックアウトされているコミットは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 rmgit revertでサブモジュールを消してしまった場合には、deinitが通らなくなってしまう。

その場合、ローカルリポジトリからサブモジュールの痕跡を消し去るには、deinitがやっていることを手で実行する必要がある。

具体的には、.git/configをテキストエディタで開いて、該当する[submodule "<path>"]エントリを削除してあげればよい。

15
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
11