简体中文 ▾ 主题 ▾ 最新版本 ▾ 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] 套件的一部分