LoginSignup
13
9

More than 5 years have passed since last update.

ふつうの.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はまだまだトラブルになる可能性が高そう、ということだけがわかりました。

13
9
2

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
13
9