简体中文 ▾ 主题 ▾ 最新版本 ▾ 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 位透明(8-bit clean)的。

非二进制行应该以换行符(LF)结束,如果存在,则必须将其计入总长度。接收方必须以相同的方式处理包含非二进制数据的 pkt-line,无论它们是否包含末尾的 LF(如果存在则去除 LF,缺失时不应报错)。

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

实现不应发送空的 pkt-line("0004")。

长度字段为 0 的 pkt-line("0000"),称为 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] 套件的一部分