English ▾ 主题 ▾ 最新版本 ▾ 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-lines 描述的。

pkt-line 是一个可变长度的二进制字符串。 该行的前四个字节(pkt-len)以十六进制指示行的总长度。 pkt-len 包括用于包含长度十六进制表示的 4 个字节。

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

非二进制行应该以 LF 结尾,如果存在,则必须包含在总长度中。 接收器必须以相同的方式处理具有非二进制数据的 pkt-lines,无论它们是否包含尾随 LF(如果存在,则删除 LF,并且在缺少 LF 时不抱怨)。

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

实现不应发送空的 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