]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/technical/protocol-capabilities.txt
Merge branch 'bc/sha-256-part-2'
[thirdparty/git.git] / Documentation / technical / protocol-capabilities.txt
CommitLineData
b31222cf
SC
1Git Protocol Capabilities
2=========================
3
90503a24
JS
4NOTE: this document describes capabilities for versions 0 and 1 of the pack
5protocol. For version 2, please refer to the link:protocol-v2.html[protocol-v2]
6doc.
7
b31222cf
SC
8Servers SHOULD support all capabilities defined in this document.
9
10On the very first line of the initial server response of either
11receive-pack and upload-pack the first reference is followed by
12a NUL byte and then a list of space delimited server capabilities.
13These allow the server to declare what it can and cannot support
14to the client.
15
16Client will then send a space separated list of capabilities it wants
17to be in effect. The client MUST NOT ask for capabilities the server
18did not say it supports.
19
20Server MUST diagnose and abort if capabilities it does not understand
21was sent. Server MUST NOT ignore capabilities that client requested
22and server advertised. As a consequence of these rules, server MUST
23NOT advertise capabilities it does not understand.
24
1b70fe5d
RS
25The 'atomic', 'report-status', 'delete-refs', 'quiet', and 'push-cert'
26capabilities are sent and recognized by the receive-pack (push to server)
27process.
b31222cf 28
9354b9a4 29The 'ofs-delta' and 'side-band-64k' capabilities are sent and recognized
af608260
JK
30by both upload-pack and receive-pack protocols. The 'agent' capability
31may optionally be sent in both protocols.
b31222cf
SC
32
33All other capabilities are only recognized by the upload-pack (fetch
34from server) process.
35
36multi_ack
37---------
38
39The 'multi_ack' capability allows the server to return "ACK obj-id
40continue" as soon as it finds a commit that it can use as a common
41base, between the client's wants and the client's have set.
42
43By sending this early, the server can potentially head off the client
44from walking any further down that particular branch of the client's
45repository history. The client may still need to walk down other
46branches, sending have lines for those, until the server has a
47complete cut across the DAG, or the client has said "done".
48
49Without multi_ack, a client sends have lines in --date-order until
50the server has found a common base. That means the client will send
51have lines that are already known by the server to be common, because
52they overlap in time with another branch that the server hasn't found
53a common base on yet.
54
55For example suppose the client has commits in caps that the server
56doesn't and the server has commits in lower case that the client
57doesn't, as in the following diagram:
58
59 +---- u ---------------------- x
60 / +----- y
61 / /
62 a -- b -- c -- d -- E -- F
63 \
64 +--- Q -- R -- S
65
66If the client wants x,y and starts out by saying have F,S, the server
67doesn't know what F,S is. Eventually the client says "have d" and
68the server sends "ACK d continue" to let the client know to stop
6a5d0b0a 69walking down that line (so don't send c-b-a), but it's not done yet,
b31222cf
SC
70it needs a base for x. The client keeps going with S-R-Q, until a
71gets reached, at which point the server has a clear base and it all
72ends.
73
74Without multi_ack the client would have sent that c-b-a chain anyway,
75interleaved with S-R-Q.
76
087e347f
NTND
77multi_ack_detailed
78------------------
79This is an extension of multi_ack that permits client to better
80understand the server's in-memory state. See pack-protocol.txt,
81section "Packfile Negotiation" for more information.
82
c9cd60f6
NTND
83no-done
84-------
85This capability should only be used with the smart HTTP protocol. If
86multi_ack_detailed and no-done are both present, then the sender is
87free to immediately send a pack following its first "ACK obj-id ready"
88message.
89
90Without no-done in the smart HTTP protocol, the server session would
91end and the client has to make another trip to send "done" before
92the server can send the pack. no-done removes the last round and
93thus slightly reduces latency.
94
b31222cf
SC
95thin-pack
96---------
97
1ba98a79
CMN
98A thin pack is one with deltas which reference base objects not
99contained within the pack (but are known to exist at the receiving
100end). This can reduce the network traffic significantly, but it
101requires the receiving end to know how to "thicken" these packs by
102adding the missing bases to the pack.
103
104The upload-pack server advertises 'thin-pack' when it can generate
105and send a thin pack. A client requests the 'thin-pack' capability
106when it understands how to "thicken" it, notifying the server that
107it can receive such a pack. A client MUST NOT request the
108'thin-pack' capability if it cannot turn a thin pack into a
109self-contained pack.
110
111Receive-pack, on the other hand, is assumed by default to be able to
112handle thin packs, but can ask the client not to use the feature by
113advertising the 'no-thin' capability. A client MUST NOT send a thin
114pack if the server advertises the 'no-thin' capability.
115
116The reasons for this asymmetry are historical. The receive-pack
117program did not exist until after the invention of thin packs, so
118historically the reference implementation of receive-pack always
119understood thin packs. Adding 'no-thin' later allowed receive-pack
120to disable the feature in a backwards-compatible manner.
b31222cf
SC
121
122
123side-band, side-band-64k
124------------------------
125
126This capability means that server can send, and client understand multiplexed
127progress reports and error info interleaved with the packfile itself.
128
129These two options are mutually exclusive. A modern client always
130favors 'side-band-64k'.
131
132Either mode indicates that the packfile data will be streamed broken
133up into packets of up to either 1000 bytes in the case of 'side_band',
134or 65520 bytes in the case of 'side_band_64k'. Each packet is made up
135of a leading 4-byte pkt-line length of how much data is in the packet,
136followed by a 1-byte stream code, followed by the actual data.
137
138The stream code can be one of:
139
140 1 - pack data
141 2 - progress messages
142 3 - fatal error message just before stream aborts
143
144The "side-band-64k" capability came about as a way for newer clients
145that can handle much larger packets to request packets that are
146actually crammed nearly full, while maintaining backward compatibility
147for the older clients.
148
149Further, with side-band and its up to 1000-byte messages, it's actually
150999 bytes of payload and 1 byte for the stream code. With side-band-64k,
151same deal, you have up to 65519 bytes of data and 1 byte for the stream
152code.
153
154The client MUST send only maximum of one of "side-band" and "side-
155band-64k". Server MUST diagnose it as an error if client requests
156both.
157
158ofs-delta
159---------
160
5d1e3415 161Server can send, and client understand PACKv2 with delta referring to
b31222cf
SC
162its base by position in pack rather than by an obj-id. That is, they can
163send/read OBJ_OFS_DELTA (aka type 6) in a packfile.
164
af608260
JK
165agent
166-----
167
168The server may optionally send a capability of the form `agent=X` to
169notify the client that the server is running version `X`. The client may
170optionally return its own agent string by responding with an `agent=Y`
171capability (but it MUST NOT do so if the server did not mention the
172agent capability). The `X` and `Y` strings may contain any printable
173ASCII characters except space (i.e., the byte range 32 < x < 127), and
174are typically of the form "package/version" (e.g., "git/1.8.3.1"). The
175agent strings are purely informative for statistics and debugging
f745acb0 176purposes, and MUST NOT be used to programmatically assume the presence
af608260
JK
177or absence of particular features.
178
b8615c3c 179object-format
180-------------
181
182This capability, which takes a hash algorithm as an argument, indicates
183that the server supports the given hash algorithms. It may be sent
184multiple times; if so, the first one given is the one used in the ref
185advertisement.
186
187When provided by the client, this indicates that it intends to use the
188given hash algorithm to communicate. The algorithm provided must be one
189that the server supports.
190
191If this capability is not provided, it is assumed that the only
192supported algorithm is SHA-1.
193
90503a24
JS
194symref
195------
196
197This parameterized capability is used to inform the receiver which symbolic ref
198points to which ref; for example, "symref=HEAD:refs/heads/master" tells the
199receiver that HEAD points to master. This capability can be repeated to
200represent multiple symrefs.
201
202Servers SHOULD include this capability for the HEAD symref if it is one of the
203refs being sent.
204
205Clients MAY use the parameters from this capability to select the proper initial
206branch when cloning a repository.
207
b31222cf
SC
208shallow
209-------
210
211This capability adds "deepen", "shallow" and "unshallow" commands to
212the fetch-pack/upload-pack protocol so clients can request shallow
213clones.
214
569e554b
NTND
215deepen-since
216------------
217
218This capability adds "deepen-since" command to fetch-pack/upload-pack
219protocol so the client can request shallow clones that are cut at a
220specific time, instead of depth. Internally it's equivalent of doing
221"rev-list --max-age=<timestamp>" on the server side. "deepen-since"
222cannot be used with "deepen".
223
269a7a83
NTND
224deepen-not
225----------
226
227This capability adds "deepen-not" command to fetch-pack/upload-pack
228protocol so the client can request shallow clones that are cut at a
229specific revision, instead of depth. Internally it's equivalent of
230doing "rev-list --not <rev>" on the server side. "deepen-not"
231cannot be used with "deepen", but can be used with "deepen-since".
232
cccf74e2
NTND
233deepen-relative
234---------------
235
236If this capability is requested by the client, the semantics of
237"deepen" command is changed. The "depth" argument is the depth from
238the current shallow boundary, instead of the depth from remote refs.
239
b31222cf
SC
240no-progress
241-----------
242
243The client was started with "git clone -q" or something, and doesn't
244want that side band 2. Basically the client just says "I do not
245wish to receive stream 2 on sideband, so do not send it to me, and if
246you did, I will drop it on the floor anyway". However, the sideband
247channel 3 is still used for error responses.
248
249include-tag
250-----------
251
252The 'include-tag' capability is about sending annotated tags if we are
253sending objects they point to. If we pack an object to the client, and
254a tag object points exactly at that object, we pack the tag object too.
255In general this allows a client to get all new annotated tags when it
256fetches a branch, in a single network connection.
257
258Clients MAY always send include-tag, hardcoding it into a request when
259the server advertises this capability. The decision for a client to
260request include-tag only has to do with the client's desires for tag
261data, whether or not a server had advertised objects in the
262refs/tags/* namespace.
263
264Servers MUST pack the tags if their referrant is packed and the client
265has requested include-tags.
266
267Clients MUST be prepared for the case where a server has ignored
268include-tag and has not actually sent tags in the pack. In such
269cases the client SHOULD issue a subsequent fetch to acquire the tags
270that include-tag would have otherwise given the client.
271
272The server SHOULD send include-tag, if it supports it, regardless
273of whether or not there are tags available.
274
275report-status
276-------------
277
9a621ad0 278The receive-pack process can receive a 'report-status' capability,
b31222cf
SC
279which tells it that the client wants a report of what happened after
280a packfile upload and reference update. If the pushing client requests
281this capability, after unpacking and updating references the server
282will respond with whether the packfile unpacked successfully and if
283each reference was updated successfully. If any of those were not
284successful, it will send back an error message. See pack-protocol.txt
285for example messages.
286
287delete-refs
288-----------
289
290If the server sends back the 'delete-refs' capability, it means that
6a5d0b0a 291it is capable of accepting a zero-id value as the target
b31222cf
SC
292value of a reference update. It is not sent back by the client, it
293simply informs the client that it can be sent zero-id values
294to delete references.
69fb9603
JK
295
296quiet
297-----
298
299If the receive-pack server advertises the 'quiet' capability, it is
300capable of silencing human-readable progress output which otherwise may
301be shown when processing the received pack. A send-pack client should
302respond with the 'quiet' capability to suppress server-side progress
303reporting if the local progress reporting is also being suppressed
304(e.g., via `push -q`, or if stderr does not go to a tty).
4acbe91a 305
1b70fe5d
RS
306atomic
307------
308
309If the server sends the 'atomic' capability it is capable of accepting
310atomic pushes. If the pushing client requests this capability, the server
311will update the refs in one atomic transaction. Either all refs are
312updated or none.
313
c714e45f
SB
314push-options
315------------
316
317If the server sends the 'push-options' capability it is able to accept
318push options after the update commands have been sent, but before the
319packfile is streamed. If the pushing client requests this capability,
320the server will pass the options to the pre- and post- receive hooks
321that process this push request.
322
4acbe91a
NTND
323allow-tip-sha1-in-want
324----------------------
325
326If the upload-pack server advertises this capability, fetch-pack may
327send "want" lines with SHA-1s that exist at the server but are not
328advertised by upload-pack.
4adf569d 329
68ee6289
FM
330allow-reachable-sha1-in-want
331----------------------------
332
333If the upload-pack server advertises this capability, fetch-pack may
334send "want" lines with SHA-1s that exist at the server but are not
335advertised by upload-pack.
336
b89363e4
JH
337push-cert=<nonce>
338-----------------
4adf569d
JH
339
340The receive-pack server that advertises this capability is willing
b89363e4
JH
341to accept a signed push certificate, and asks the <nonce> to be
342included in the push certificate. A send-pack client MUST NOT
4adf569d
JH
343send a push-cert packet unless the receive-pack server advertises
344this capability.
10ac85c7
JH
345
346filter
347------
348
349If the upload-pack server advertises the 'filter' capability,
350fetch-pack may send "filter" commands to request a partial clone
351or partial fetch and request that the server omit various objects
352from the packfile.