readGitについて勉強した事がなかったので調べた。Gitの内部構造の概略と調べるのに必要な箇所を整理する。ソースへのリンクはv2.1.0-rc2を参照している。Gitの概要Gitは分散型バージョン管理システムと呼ばれている。https://git-scm.com/2層のアーキテクチャGitは次の2層アーキテクチャで実現されている。filesystem)Gitは対象をオブジェクトの集まりとして捉え管理している。表現しているこれらは、プロジェクトルートに存在する.gitディレクトリの中に収まっている。ディレクトリは以下の様になっている。行った操作履歴により存在するファイルは異なるが基本的な構造は変わらない。自分の環境を例に出す。ファイル、ディレクトリなら格納されるファイルの種類、目的などの概要を整理すると以下にになる。上に並べたファイル群に絞る。前節でファイルタイプとして書いたように、Gitシステムは幾つかの種類のファイルで作られている。ここでは、ファイル・タイプを2層のアーキテクチャで区分けして説明する。格納しているデータベース部分・次に格納する情報をまとめたインデックス、の2つで構成されている。プロジェクトの歴史を4種類のオブジェクトの組み合わせで表現している。最初のメンバに含んだ形になっている。https://github.com/git/git/blob/v2.1.0-rc2/tag.h#L8-L13Objectはタイプ名と表現対象を連結しzlibで圧縮した内容を持つファイルになる。そのファイルの置かれる場所はファイルの内容をsha1を取ることで名前が一意に決まる。具体的にはハッシュ値の上位2桁が.git/objects以下のディレクトリ名に対応し残りの38桁がファイル名になる。.git/objectsとかするとハッシュに対応するようにファイルが置かれている事がわかる。すると中身を読むことが出来る。${SHA1_FILE_NAME}ファイルの内容はblobが保持する。以外のオブジェクトは他のオブジェクトのハッシュ値を経由し関係を保持する。オブジェクトが保持するが以下の様にリンクで実現されている。コミット履歴についても同様でcommitオブジェクトの持つリンクで実現される。作られるタグと即座には対応しない。公式資料にある通り実態は2種類ある。タグは後述する参照がオブジェクトのハッシュ値をrefs/tags以下に保持することで実現される。タグ生成時にコメントを記述した場合は対象オブジェクトを指すtagオブジェクトが生成される。この時、タグに対応した参照はtagオブジェクトを指している。オブジェクトへの一覧が格納されている。サブディレクトリが存在してもtreeを介した表現にはならない。登録されたファイルのプロジェクトルートからの相対パスとblobオブジェクトの名前(sha1)が格納されている。これがGitでは空ディレクトリをトラック出来ないという制約に繋がる。--stageで内容を確認できる。Commitの変更を記録しているテキストファイル参照オブジェクトの名前に対応するハッシュ値を保持したテキストファイルオブジェクトは名前がハッシュ値になってしまうので人間から指定が識別しづらい。そこで、重要なオブジェクトを人間が扱えるように保持するファイルが役に立つ。ユーザ・インタフェースを支えている。HEADなどの指す先が変更された時の記録で、各変更前後のcommitを保持している。