mirror of
https://github.com/git/git.git
synced 2024-11-12 20:23:02 +01:00
b31222cfb7
The current technical documentation for the packfile protocol is both sparse and incorrect. This documents the fetch-pack/upload-pack and send-pack/ receive-pack protocols much more fully. Add documentation from Shawn's upcoming http-protocol docs that is shared by the packfile protocol. protocol-common.txt describes ABNF notation amendments, refname rules and the packet line format. Add documentation on the various capabilities supported by the upload-pack and receive-pack protocols. protocol-capabilities.txt describes multi-ack, thin-pack, side-band[-64k], shallow, no-progress, include-tag, ofs-delta, delete-refs and report-status. Signed-off-by: Scott Chacon <schacon@gmail.com> Signed-off-by: Nanako Shiraishi <nanako3@lavabit.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
96 lines
2.7 KiB
Text
96 lines
2.7 KiB
Text
Documentation Common to Pack and Http Protocols
|
|
===============================================
|
|
|
|
ABNF Notation
|
|
-------------
|
|
|
|
ABNF notation as described by RFC 5234 is used within the protocol documents,
|
|
except the following replacement core rules are used:
|
|
----
|
|
HEXDIG = DIGIT / "a" / "b" / "c" / "d" / "e" / "f"
|
|
----
|
|
|
|
We also define the following common rules:
|
|
----
|
|
NUL = %x00
|
|
zero-id = 40*"0"
|
|
obj-id = 40*(HEXDIGIT)
|
|
|
|
refname = "HEAD"
|
|
refname /= "refs/" <see discussion below>
|
|
----
|
|
|
|
A refname is a hierarchical octet string beginning with "refs/" and
|
|
not violating the 'git-check-ref-format' command's validation rules.
|
|
More specifically, they:
|
|
|
|
. They can include slash `/` for hierarchical (directory)
|
|
grouping, but no slash-separated component can begin with a
|
|
dot `.`.
|
|
|
|
. They must contain at least one `/`. This enforces the presence of a
|
|
category like `heads/`, `tags/` etc. but the actual names are not
|
|
restricted.
|
|
|
|
. They cannot have two consecutive dots `..` anywhere.
|
|
|
|
. They cannot have ASCII control characters (i.e. bytes whose
|
|
values are lower than \040, or \177 `DEL`), space, tilde `~`,
|
|
caret `{caret}`, colon `:`, question-mark `?`, asterisk `*`,
|
|
or open bracket `[` anywhere.
|
|
|
|
. They cannot end with a slash `/` nor a dot `.`.
|
|
|
|
. They cannot end with the sequence `.lock`.
|
|
|
|
. They cannot contain a sequence `@{`.
|
|
|
|
. They cannot contain a `\\`.
|
|
|
|
|
|
pkt-line Format
|
|
---------------
|
|
|
|
Much (but not all) of the payload is described around pkt-lines.
|
|
|
|
A pkt-line is a variable length binary string. The first four bytes
|
|
of the line, the pkt-len, indicates the total length of the line,
|
|
in hexadecimal. The pkt-len includes the 4 bytes used to contain
|
|
the length's hexadecimal representation.
|
|
|
|
A pkt-line MAY contain binary data, so implementors MUST ensure
|
|
pkt-line parsing/formatting routines are 8-bit clean.
|
|
|
|
A non-binary line SHOULD BE terminated by an LF, which if present
|
|
MUST be included in the total length.
|
|
|
|
The maximum length of a pkt-line's data component is 65520 bytes.
|
|
Implementations MUST NOT send pkt-line whose length exceeds 65524
|
|
(65520 bytes of payload + 4 bytes of length data).
|
|
|
|
Implementations SHOULD NOT send an empty pkt-line ("0004").
|
|
|
|
A pkt-line with a length field of 0 ("0000"), called a flush-pkt,
|
|
is a special case and MUST be handled differently than an empty
|
|
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"
|
|
----
|
|
|
|
Examples (as C-style strings):
|
|
|
|
----
|
|
pkt-line actual value
|
|
---------------------------------
|
|
"0006a\n" "a\n"
|
|
"0005a" "a"
|
|
"000bfoobar\n" "foobar\n"
|
|
"0004" ""
|
|
----
|