Open2

なぜGit submoduleは単なる再帰的チェックアウトではないのか

okuokuokuoku

or 何故 git submodule absorbgitdirs コマンドなんてものが存在するのか

okuokuokuoku

昔は単なる再帰的チェックアウトだった

https://github.com/git/git/blob/8b0e15fa95e11965f18c8d2585dc8ffd9bfc9356/Documentation/RelNotes/1.7.8.txt#L47-L52

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の位置にチェックアウトしても期待通り動作する。ブランチを切り替えたりするときに破綻するけど。