ABNF Notation

以下の置換コア・ルールが使用されていることを除き、RFC 5234で説明されているABNF記法がプロトコルドキュメント内で使用されます:

  HEXDIG    =  DIGIT / "a" / "b" / "c" / "d" / "e" / "f"

また、以下の共通ルールを定義します:

  NUL       =  %x00
  zero-id   =  40*"0"
  obj-id    =  40*(HEXDIGIT)

  refname  =  "HEAD"
  refname /=  "refs/" <see discussion below>

refnameは、 "refs/" で始まり、 git-check-ref-format コマンドの検証ルールに違反していない階層的な8ビット文字列(octet string)です。より具体的には、それらは:

  1. 階層(ディレクトリ)グループ化のためにスラッシュ / を含めることができますが、スラッシュで区切られたコンポーネントをドット . で始めることはできません。

  2. 少なくとも1つの / が含まれている必要があります。 これにより、 heads/tags/ などのカテゴリの存在が強制されますが、実際の名前は制限されません。

  3. どこにも2つの連続したドット .. を含めることはできません。

  4. どこにも ASCII制御文字(つまり、値が \040 未満、または \177 DEL )、空白、チルダ ~ 、キャレット ^ 、コロン : 、 疑問符 ? 、アスタリスク * 、 開き角かっこ [ は使用できません。

  5. スラッシュ / またはドット . で終了することはできません。

  6. シーケンス .lock で終了することはできません。

  7. シーケンス @{ を含めることはできません。

  8. \ を含めることはできません。

pkt-line Format

(すべてではありませんが)ペイロードの多くがpkt-lines周りで説明されています。

pkt-lineは、可変長のバイナリ文字列です。行の最初の4バイトであるpkt-lenは、行の全長を16進数で示します。pkt-lenには、長さの16進表現を含めるために使用される4バイトが含まれます。

pkt-lineにはバイナリデータが含まれる場合があるため、実装者はpkt-lineの パース/フォーマット ルーチンが8ビットクリーンであることを確認する必要があります。

非バイナリ行はLFで終了する必要があります。LFが存在する場合は、全長に含める必要があります。受信者は、非バイナリデータを含むpkt-lineを、末尾のLFが含まれているかどうかに関係なく同じように処理する必要があります(LFが存在する場合はそれを取り除き、欠落している場合は文句を言いません)。

pkt-lineのデータコンポーネントの最大長は65516バイトです。実装は、長さが65520(65516バイトのペイロード+4バイトの長さデータ)を超えるpkt-lineの送信は禁止でです。

実装は空のpkt-line("0004")を送信すべきではありません。

flash-pktと呼ばれる長さフィールドが0("0000")のpkt-lineは特殊なケースであり、空のpkt-line("0004")とは異なる方法で処理しなければいけません。

  pkt-line     =  data-pkt / flush-pkt

  data-pkt     =  pkt-len pkt-payload
  pkt-len      =  4*(HEXDIG)
  pkt-payload  =  (pkt-len - 4)*(OCTET)

  flush-pkt    = "0000"

例(C言語の文字列形式):

  pkt-line          actual value
  ---------------------------------
  "0006a\n"         "a\n"
  "0005a"           "a"
  "000bfoobar\n"    "foobar\n"
  "0004"            ""