簡體中文 ▾ 主題 ▾ 最新版本 ▾ gitprotocol-common 最後更新於 2.50.0

名稱

gitprotocol-common - 各種協議的通用項

概要

<over-the-wire-protocol>

描述

本文件定義了 Git 中各種傳輸協議和檔案格式的通用項。

ABNF 記法

協議文件中使用 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 命令的驗證規則。具體來說,它們:

  1. 它們可以包含斜槓 / 進行分層(目錄)分組,但任何斜槓分隔的元件都不能以點 . 開頭。

  2. 它們必須包含至少一個 /。這強制要求存在一個類別,如 heads/tags/ 等,但實際名稱不受限制。

  3. 它們不能在任何地方包含兩個連續的點 ..

  4. 它們不能在任何地方包含 ASCII 控制字元(即位元組值小於 \040,或 \177 DEL)、空格、波浪號 ~、插入符號 ^、冒號 :、問號 ?、星號 * 或開方括號 [

  5. 它們不能以斜槓 / 或點 . 結尾。

  6. 它們不能以序列 .lock 結尾。

  7. 它們不能包含序列 @{

  8. 它們不能包含 \\

pkt-line 格式

大部分(但非全部)的載荷是圍繞 pkt-lines 描述的。

pkt-line 是一個可變長度的二進位制字串。行的前四個位元組,即 pkt-len,表示行的總長度,以十六進位制表示。pkt-len 包括用於包含長度十六進位制表示的 4 個位元組。

pkt-line MAY 包含二進位制資料,因此實現者 MUST 確保 pkt-line 解析/格式化例程是 8 位乾淨的。

非二進位制行 SHOULD BE 以 LF 結尾,如果存在,則必須包含在總長度中。接收者 MUST 像處理包含 LF 的 pkt-lines 一樣處理不包含 LF 的 pkt-lines(如果存在則剝離 LF,如果缺失則不抱怨)。

pkt-line 資料元件的最大長度為 65516 位元組。實現 MUST NOT 傳送長度超過 65520(65516 位元組的載荷 + 4 位元組的長度資料)的 pkt-line。

實現 SHOULD NOT 傳送空 pkt-line ("0004")。

長度欄位為 0 ("0000") 的 pkt-line,稱為 flush-pkt,是一種特殊情況,MUST 被不同於空 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"            ""

GIT

Git[1] 套件的一部分