参考

git submoduleコマンドオプション一覧

add … サブモジュールを追加

  • .gitsubmodulesファイルに追記される(存在しなければ生成)
  • タグ指定やコミットハッシュ指定ができないので注意
$ git submodule add --name submodule-A --branch main --depth 1 https://github.com/example/submodule-A.git
$ cat .gitmodules
[submodule "submodule-A"]
        path = submodule-A
        url = https://github.com/example/submodule-A.git
        branch = main
$ cd submodule-A
git checkout v1.0
cd ..
git add submodule-A
git commit -m "moved submodule to v1.0"
git push

[発生するエラー]

  • 既に追加されている(.submodulesから手動削除しても)
'submodule-A' already exists in the index
  • 手動で削除したりすると怒られる。空ファイルを作成して再実行
please make sure that the .gitmodules file is in the working tree
  • サブモジュール削除の残骸による影響
    • –forceをつけて強制追加するか
    • 下記deinitを参考に正しく解除する
"submodule" already exists in the index

status

init … サブモジュールフォルダを初期化

deinit … サブモジュールを解除

  • サブモジュール自体を削除する場合は.git/modules/<submodule_name>/も削除する必要がある
  • .gitmodulesからも消えないのはgit rm -rでサブモジュールを削除していないから
# サブモジュールを解除
$ git submodule deinit submodule-A
Cleared directory 'submodule-A'

# git履歴から削除(※これ重要で.gitmodulesから消えてくれる)
$ git rm -r submodule-A/

# .git以下からも削除(※これ重要。面倒くさい)
$ rm -rf .git/modules/submodule-A

update .. サブモジュールフォルダを更新する

  • deinitした後にupdateすると、指定branchの状態に戻せる
# ファイルを削除する
$ ls -a submodule-A/
. .. .git README.md
$ rm -f submodule-A/README.md

# いったんサブモジュールをクリア
$ git submodule deinit submodule-A
Cleared directory 'submodule-A'
$ ls -a submodule-A/
.  ..

# 再度updateすると初期checkout状態に戻る
$ git submodule update submodule-A
Submodule path 'submodule-A': checked out 'efe4cb45161be836d602d5cd0f857e62661dae8b'
$ ls -a submodule-A/
. .. .git README.md

checkout

rebase

merge

custom

none

set-branch

set-url

summary

foreach

sync

absorbgitdirs