Git
英语 ▾ 主题 ▾ 最新版本 ▾ gitprotocol-common 最后更新于 2.43.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