Gitバンドル形式は、refとGitオブジェクトの両方を表す形式です。

Format

ABNF表記を使用してGitバンドル形式を定義します。 詳細については、 protocol-common.txt を参照してください。

v2バンドルは以下のようになります:

bundle    = signature *prerequisite *reference LF pack
signature = "# v2 git bundle" LF

prerequisite = "-" obj-id SP comment LF
comment      = *CHAR
reference    = obj-id SP refname LF

pack         = ... ; packfile

v3バンドルは以下のようになります:

bundle    = signature *capability *prerequisite *reference LF pack
signature = "# v3 git bundle" LF

capability   = "@" key ["=" value] LF
prerequisite = "-" obj-id SP comment LF
comment      = *CHAR
reference    = obj-id SP refname LF
key          = 1*(ALPHA / DIGIT / "-")
value        = *(%01-09 / %0b-FF)

pack         = ... ; packfile

Semantics

Gitバンドルはいくつかの部分で構成されています。

  • capabilities (機能)はv3形式のみであり、バンドルを正しく読み取るために必要な機能を示します。

  • prerequisites (前提条件)には、バンドルに含まれていないオブジェクトがリストされており、バンドル内のデータを使用するには、バンドルのリーダーがそれらを既に持っている必要があります。 バンドルに格納されているオブジェクトは、前提条件オブジェクトとそれらから到達可能なもの(たとえば、バンドル内のツリーオブジェクトは、前提条件から到達可能なブロブを参照できます)、および/または 前提条件オブジェクトに対するデルタとして表現されているものを参照する場合があります。

  • references には、履歴グラフのヒントが記録されています。つまり、バンドルのリーダーがそこから `git fetch ` できるモノです。

  • pack は、上記の「references」に記録された参照を持つリポジトリから、上記の「prerequisites」にリストされたオブジェクトを指す参照を持つリポジトリにフェッチする場合に、 git fetch が送信するパックデータストリームです。

バンドル形式では、前提条件(prerequisite)の obj-id の後にコメントを付けることができます。 これはコメントであり、特別な意味はありません。 バンドルの作成者は、ここに任意の文字列を入れてもいいです。 バンドルのリーダーはコメントを無視しなければなりません。

Note on the shallow clone and a Git bundle

注意: 前提条件は、浅いクローンの境界(shallow-clone boundary)を表していないことに注意してください。 前提条件と浅いクローンの境界のセマンティクスは異なり、Gitバンドルv2形式は浅いクローンのリポジトリを表すことはできません。

Capabilities

ネゴシエーションの機会はないので、不明な機能により git bundle は中止(abort)されます。 唯一の既知の機能は object-format です。これは、使用中のハッシュアルゴリズムを指定し、 extensions.objectFormat 構成値と同じ値を取ることができます。