简体中文 ▾ 主题 ▾ 最新版本 ▾ 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-line 进行描述。

pkt-line 是一个变长二进制字符串。行的前四个字节,即 pkt-len,以十六进制表示行的总长度。pkt-len 包含用于表示长度的十六进制值的4个字节。

pkt-line 可以包含二进制数据,因此实现者必须确保 pkt-line 解析/格式化例程是 8 位干净的。

非二进制行应以 LF 终止,如果存在,则必须包含在总长度中。接收方必须对包含非二进制数据的 pkt-line 一视同仁,无论它们是否包含尾随 LF(如果存在则剥离 LF,如果缺少则不报错)。

pkt-line 数据组件的最大长度为 65516 字节。实现方不得发送长度超过 65520(65516 字节有效载荷 + 4 字节长度数据)的 pkt-line。

实现方不应发送空的 pkt-line(“0004”)。

长度字段为 0(“0000”)的 pkt-line,称为 flush-pkt,是一种特殊情况,必须与空的 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] 套件的一部分

scroll-to-top