Chapter 10. git をハックする

Table of Contents

オブジェクトの保管形式
Git ソースコードの鳥瞰図

この章では git の実装内部の詳細について説明します。 これらの内容はおそらく git の開発者のみが必要となる内容です。

オブジェクトの保管形式

すべてのオブジェクトは静的に決定された "種別" を持っており、 それによりオブジェクトの形式が特定されます(例えば、どのように使用され どのように他のオブジェクトを参照するかなど)。現在のところ、オブジェクト 種別は4つ存在します: "blob", "tree", "commit", "tag" です。

オブジェクトの種別に関係なく、すべてのオブジェクトは次の特徴を持ちます: オブジェクトは全て zlib で圧縮され、ヘッダにはオブジェクトの種別だけでなく、 オブジェクトデータのサイズの情報が含まれています。 なお、オブジェクトの名前に使用されている SHA-1 ハッシュ値は元データ+このヘッダの ハッシュ値となっています。従ってファイルの sha1sum の結果は そのオブジェクトの名前とは一致しません。

その結果、オブジェクトの一般的な一貫性はその中身やオブジェクト種別とは 常に独立してテストすることができます:全ておオブジェクトは次のようにして 検証することができます。(a)それらのハッシュ値がファイルの中身と一致していること。そして、 (b)オブジェクトを解凍することができ、解凍したデータは <オブジェクトの種別> 空白 <サイズ> + <byte\0> + <オブジェクトのバイナリデータ> の順番となっていること。

構造化されたオブジェクトの場合は、さらにその構造と他のオブジェクトの 連結性によって懸賞することができます。これらは git fsck プログラムが 通常行っている内容であり、全オブジェクトの完全な依存グラフを生成し、 それらの内部一貫性を検証します(さらに、単にハッシュを使用した表面的な 一貫性の検証も行います)