Git
日本語 ▾ トピック ▾ 最新バージョン ▾ gitformat-commit-graph は 2.47.0 で最後に更新されました

NAME

gitformat-commit-graph - Git コミットグラフのフォーマット

SYNOPSIS

$GIT_DIR/objects/info/commit-graph
$GIT_DIR/objects/info/commit-graphs/*

DESCRIPTION

Git コミットグラフは、コミット OID のリストと、以下のメタデータの一部を格納します。

  • コミットの世代番号。

  • ルートツリー OID。

  • コミット日。

  • グラフファイル内の位置参照を使用して格納されたコミットの親。

  • リクエストされた場合、コミットとその最初の親の間で変更されたパスを保持するコミットのブルームフィルター。

これらの位置参照は、コミット OID のリスト内の配列位置に対応する符号なし32ビット整数として格納されます。親を追跡するために使用する特別な定数がいくつかあるため、最大で (1 << 30) + (1 << 29) + (1 << 28) - 1 (約18億) のコミットを格納できます。

コミットグラフファイルは次の形式を持ちます。

グラフに余分なデータを追加する拡張機能を許可するために、本文を「チャンク」に整理し、本文の先頭にバイナリ検索テーブルを提供します。ヘッダーには、チャンクの数やハッシュタイプなど、特定の値が含まれています。

すべてのマルチバイト数は、ネットワークバイトオーダーです。

HEADER

4-byte signature:
    The signature is: {'C', 'G', 'P', 'H'}
1-byte version number:
    Currently, the only valid version is 1.
 1-byte Hash Version
     We infer the hash length (H) from this value:
1 => SHA-1
2 => SHA-256
     If the hash type does not match the repository's hash algorithm, the
     commit-graph file should be ignored with a warning presented to the
     user.
1-byte number (C) of "chunks"
1-byte number (B) of base commit-graphs
    We infer the length (H*B) of the Base Graphs chunk
    from this value.

CHUNK LOOKUP

(C + 1) * 12 bytes listing the table of contents for the chunks:
    First 4 bytes describe the chunk id. Value 0 is a terminating label.
    Other 8 bytes provide the byte-offset in current file for chunk to
    start. (Chunks are ordered contiguously in the file, so you can infer
    the length using the next chunk position if necessary.) Each chunk
    ID appears at most once.
The CHUNK LOOKUP matches the table of contents from
the chunk-based file format, see gitformat-chunk[5]
The remaining data in the body is described one chunk at a time, and
these chunks may be given in any order. Chunks are required unless
otherwise specified.

CHUNK DATA

OID Fanout (ID: {O, I, D, F}) (256 * 4 バイト)

The ith entry, F[i], stores the number of OIDs with first
byte at most i. Thus F[255] stores the total
number of commits (N).

OID Lookup (ID: {O, I, D, L}) (N * H バイト)

The OIDs for all commits in the graph, sorted in ascending order.

コミットデータ (ID: {C, D, A, T }) (N * (H + 16) バイト)

  • 最初の H バイトは、ルートツリーの OID 用です。

  • 次の 8 バイトは、i 番目のコミットの最初の 2 つの親の位置用です。その位置に親がない場合は、値 0x70000000 を格納します。親が 2 つ以上ある場合、2 番目の値は最上位ビットがオンになり、他のビットは Extra Edge List チャンクへの配列位置を格納します。

  • 次の 8 バイトは、コミットのトポロジカルレベル (世代番号 v1) と、EPOCH からの秒単位のコミット時間を格納します。世代番号は最初の 4 バイトの上位 30 ビットを使用し、コミット時間は 2 番目の 4 バイトの 32 ビットと、最下位バイトの最下位 2 ビットを使用して、コミット時間の 33 番目と 34 番目のビットを格納します。

世代データ (ID: {G, D, A, 2 }) (N * 4 バイト) [オプション]

  • この 4 バイトの値のリストは、コミットの修正されたコミット日付オフセットを格納し、コミットデータチャンクと同じ順序で配置されます。

  • 修正されたコミット日付オフセットが 31 ビット以内に格納できない場合、値は最上位ビットがオンになり、他のビットは世代データオーバーフローチャンクへの修正されたコミット日付の位置を格納します。

  • 世代データチャンクは、互換性のあるバージョンの Git によってコミットグラフファイルが書き込まれた場合にのみ存在し、分割されたコミットグラフチェーンの場合、最上位レイヤーにも世代データチャンクがあります。

世代データオーバーフロー (ID: {G, D, O, 2 }) [オプション]

  • この 8 バイトの値のリストは、修正されたコミット日付オフセットを格納し、31 ビット以内に格納できないコミットの修正されたコミット日付オフセットを格納します。

  • 世代データオーバーフローチャンクは、世代データチャンクが存在し、少なくとも 1 つの修正されたコミット日付オフセットが 31 ビット以内に格納できない場合にのみ存在します。

Extra Edge List (ID: {E, D, G, E}) [オプション]

This list of 4-byte values store the second through nth parents for
all octopus merges. The second parent value in the commit data stores
an array position within this list along with the most-significant bit
on. Starting at that array position, iterate through this list of commit
positions for the parents until reaching a value with the most-significant
bit on. The other bits correspond to the position of the last parent.

ブルームフィルターインデックス (ID: {B, I, D, X}) (N * 4 バイト) [オプション]

  • i 番目のエントリ BIDX[i] は、辞書順で、コミット 0 からコミット i (両端を含む) までのすべてのブルームフィルターのバイト数を格納します。i 番目のコミットのブルームフィルターは、BIDX[i-1] から BIDX[i] (ヘッダー長を加えたもの) までの範囲にあります。ここで、BIDX[-1] は 0 です。

  • BIDX チャンクは、BDAT チャンクが存在しない場合は無視されます。

ブルームフィルターデータ (ID: {B, D, A, T}) [オプション]

  • 3 つの符号なし 32 ビット整数で構成されるヘッダーで始まります

    • 使用されているハッシュアルゴリズムのバージョン。現在、https://en.wikipedia.org/wiki/MurmurHash#Algorithm に記載されているように正確に実装された murmur3 ハッシュの 32 ビットバージョンに対応する値 2 と、https://doi.org/10.1007/978-3-540-30494-4_26 "確率的検証におけるブルームフィルター" に記載されているように、シード値 0x293ae76f および 0x7e646e2 を使用したダブルハッシュ手法をサポートしています。バージョン 1 のブルームフィルターには、char が符号付きで、リポジトリに 0x80 以上の文字を持つパス名がある場合に発生するバグがあります。Git はそれらの読み書きをサポートしていますが、この機能は将来のバージョンの Git で削除されます。

    • パスがハッシュされる回数、つまり、ファイルがコミットに存在するかどうかを累積的に決定するビット位置の数。

    • ブルームフィルター内のエントリごとの最小ビット数 b。フィルターに n 個のエントリが含まれている場合、フィルターサイズは n*b ビットを含む最小数の 64 ビットワードになります。

  • チャンクの残りの部分は、辞書順にコミットに対して計算されたすべてのブルームフィルターの連結です。

  • 注: 変更がないコミットまたは 512 以上の変更があるコミットには、すべてビットが 0 または 1 に設定された長さ 1 のブルームフィルターがあります。

  • BDAT チャンクは、BIDX が存在する場合にのみ存在します。

ベースグラフリスト (ID: {B, A, S, E}) [オプション]

This list of H-byte hashes describe a set of B commit-graph files that
form a commit-graph chain. The graph position for the ith commit in this
file's OID Lookup chunk is equal to i plus the number of commits in all
base graphs.  If B is non-zero, this chunk must exist.

TRAILER

H-byte HASH-checksum of all of the above.

歴史的な注意

世代データ (GDA2) および世代データオーバーフロー (GDO2) チャンクには、チャンク ID に番号 2 が含まれています。これは、以前のバージョンの Git が ID "GDAT" および "GDOV" でこれらのチャンクに誤った可能性のあるデータを書き込んだためです。ID を変更することにより、新しいバージョンの Git はそれらの古いチャンクを黙って無視し、不正なデータを信頼せずに新しい情報を書き込みます。

GIT

git[1] スイートの一部

scroll-to-top