Open2
なぜGit submoduleは単なる再帰的チェックアウトではないのか
or 何故 git submodule absorbgitdirs
コマンドなんてものが存在するのか
昔は単なる再帰的チェックアウトだった
Git 1.7.8 でいわゆる worktree
と同様の .git
ファイルに gitdir を書き込む方式に改められ、その理由は
This is to make it possible to switch between commits in the superproject that has and does not have the submodule in the tree without re-cloning.
としている。要はsuperprojectの .git
以下にリポジトリ実体を隠しておかないとブランチのスイッチ時にsubmoduleとなっているディレクトリを消さないといけなくなった場合に(再チェックアウトが必要になるので)困る。と。
言い換えると、今の submodule はある種のworktreeというだけなので、手動でGitリポジトリをsubmoduleの位置にチェックアウトしても期待通り動作する。ブランチを切り替えたりするときに破綻するけど。