ふつうの.git
ふつうのgitリポジトリの.gitはフォルダ。中にこんなものがはいってたりする
- FETCH_HEAD : リモートの最新
- HEAD : 最新のワークがどのブランチ/タグを指しているか
- ORIG_HEAD : git cloneしたリモートブランチの最新
- MERGE_HEAD : git mergeした相手の情報
- config : リポジトリ固有の設定(ini形式)
- description : なんかリポジトリの名前が入るらしい
- hooks/ : フックが入るパス
- index : git addしたりすると、その時の状態が格納されるバイナリファイル
- logs/ : 参照の更新情報
- modules/ : サブモジュールの.git
- objects/ : ファイルとかフォルダの実態
- objects/pack/ : git gcされて複数のオブジェクトがマージされたやつがはいってる
- packed-refs/ : packされた古いオブジェクト類を参照しているrefs
- refs/ : タグとかブランチとか
- worktree/ : git worktree addするとここにフォルダができる
サブモジュールの.git
サブモジュールの.gitはファイル。こんな感じのものが書かれている。親のリポジトリの.git/modules/commonlibを見てねということ。
gitdir: ../.git/modules/commonlib
サブモジュールの実態はこの参照先を見るが、基本的にはふつうのgitリポジトリと同じ。逆方向のリンク情報が格納されたgitdirファイルだけが違うっぽい
* gitdir: サブモジュールのワークフォルダ無いの.gitファイルへの相対パスが書かれている。
worktreeの.git
worktreeの.gitも基本的にはサブモジュールと同じ、リンクの書かれたテキストファイル。ただし、参照先は.git/worktree以下。
で、この中のリポジトリ構成が少し異なる
- HEAD : ふつうのリポジトリと同じ
- ORIG_HEAD : ふつうのリポジトリと同じ
- commondir :
../..
とだけ書かれたテキストファイル - gitdir : サブモジュールと同じ
- index : ふつうのリポジトリと同じ
worktreeはobjectとかrefは参照元と共有するので、commondirというファイルを使って探し先を保持しているらしい。
で、今日の成果だけど、libgit2はobjects/HEAD/refsの項目があるかどうかで、正しいリポジトリかどうかを判定している。よって、worktreeで作ったフォルダを開こうとするとエラーになる。
ということで、worktreeはまだまだトラブルになる可能性が高そう、ということだけがわかりました。