Git fork
1gitprotocol-v2(5)
2=================
3
4NAME
5----
6gitprotocol-v2 - Git Wire Protocol, Version 2
7
8SYNOPSIS
9--------
10[verse]
11<over-the-wire-protocol>
12
13DESCRIPTION
14-----------
15
16This document presents a specification for a version 2 of Git's wire
17protocol. Protocol v2 will improve upon v1 in the following ways:
18
19 * Instead of multiple service names, multiple commands will be
20 supported by a single service
21 * Easily extendable as capabilities are moved into their own section
22 of the protocol, no longer being hidden behind a NUL byte and
23 limited by the size of a pkt-line
24 * Separate out other information hidden behind NUL bytes (e.g. agent
25 string as a capability and symrefs can be requested using 'ls-refs')
26 * Reference advertisement will be omitted unless explicitly requested
27 * ls-refs command to explicitly request some refs
28 * Designed with http and stateless-rpc in mind. With clear flush
29 semantics the http remote helper can simply act as a proxy
30
31In protocol v2 communication is command oriented. When first contacting a
32server a list of capabilities will be advertised. Some of these capabilities
33will be commands which a client can request be executed. Once a command
34has completed, a client can reuse the connection and request that other
35commands be executed.
36
37Packet-Line Framing
38-------------------
39
40All communication is done using packet-line framing, just as in v1. See
41linkgit:gitprotocol-pack[5] and linkgit:gitprotocol-common[5] for more information.
42
43In protocol v2 these special packets will have the following semantics:
44
45 * '0000' Flush Packet (flush-pkt) - indicates the end of a message
46 * '0001' Delimiter Packet (delim-pkt) - separates sections of a message
47 * '0002' Response End Packet (response-end-pkt) - indicates the end of a
48 response for stateless connections
49
50Initial Client Request
51----------------------
52
53In general a client can request to speak protocol v2 by sending
54`version=2` through the respective side-channel for the transport being
55used which inevitably sets `GIT_PROTOCOL`. More information can be
56found in linkgit:gitprotocol-pack[5] and linkgit:gitprotocol-http[5], as well as the
57`GIT_PROTOCOL` definition in linkgit:git[1]. In all cases the
58response from the server is the capability advertisement.
59
60Git Transport
61~~~~~~~~~~~~~
62
63When using the git:// transport, you can request to use protocol v2 by
64sending "version=2" as an extra parameter:
65
66 003egit-upload-pack /project.git\0host=myserver.com\0\0version=2\0
67
68SSH and File Transport
69~~~~~~~~~~~~~~~~~~~~~~
70
71When using either the ssh:// or file:// transport, the GIT_PROTOCOL
72environment variable must be set explicitly to include "version=2".
73The server may need to be configured to allow this environment variable
74to pass.
75
76HTTP Transport
77~~~~~~~~~~~~~~
78
79When using the http:// or https:// transport a client makes a "smart"
80info/refs request as described in linkgit:gitprotocol-http[5] and requests that
81v2 be used by supplying "version=2" in the `Git-Protocol` header.
82
83 C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
84 C: Git-Protocol: version=2
85
86A v2 server would reply:
87
88 S: 200 OK
89 S: <Some headers>
90 S: ...
91 S:
92 S: 000eversion 2\n
93 S: <capability-advertisement>
94
95Subsequent requests are then made directly to the service
96`$GIT_URL/git-upload-pack`. (This works the same for git-receive-pack).
97
98Uses the `--http-backend-info-refs` option to
99linkgit:git-upload-pack[1].
100
101The server may need to be configured to pass this header's contents via
102the `GIT_PROTOCOL` variable. See the discussion in linkgit:git-http-backend[1].
103
104Capability Advertisement
105------------------------
106
107A server which decides to communicate (based on a request from a client)
108using protocol version 2, notifies the client by sending a version string
109in its initial response followed by an advertisement of its capabilities.
110Each capability is a key with an optional value. Clients must ignore all
111unknown keys. Semantics of unknown values are left to the definition of
112each key. Some capabilities will describe commands which can be requested
113to be executed by the client.
114
115 capability-advertisement = protocol-version
116 capability-list
117 flush-pkt
118
119 protocol-version = PKT-LINE("version 2" LF)
120 capability-list = *capability
121 capability = PKT-LINE(key[=value] LF)
122
123 key = 1*(ALPHA | DIGIT | "-_")
124 value = 1*(ALPHA | DIGIT | " -_.,?\/{}[]()<>!@#$%^&*+=:;")
125
126Command Request
127---------------
128
129After receiving the capability advertisement, a client can then issue a
130request to select the command it wants with any particular capabilities
131or arguments. There is then an optional section where the client can
132provide any command specific parameters or queries. Only a single
133command can be requested at a time.
134
135 request = empty-request | command-request
136 empty-request = flush-pkt
137 command-request = command
138 capability-list
139 delim-pkt
140 command-args
141 flush-pkt
142 command = PKT-LINE("command=" key LF)
143 command-args = *command-specific-arg
144
145 command-specific-args are packet line framed arguments defined by
146 each individual command.
147
148The server will then check to ensure that the client's request is
149comprised of a valid command as well as valid capabilities which were
150advertised. If the request is valid the server will then execute the
151command. A server MUST wait till it has received the client's entire
152request before issuing a response. The format of the response is
153determined by the command being executed, but in all cases a flush-pkt
154indicates the end of the response.
155
156When a command has finished, and the client has received the entire
157response from the server, a client can either request that another
158command be executed or can terminate the connection. A client may
159optionally send an empty request consisting of just a flush-pkt to
160indicate that no more requests will be made.
161
162Capabilities
163------------
164
165There are two different types of capabilities: normal capabilities,
166which can be used to convey information or alter the behavior of a
167request, and commands, which are the core actions that a client wants to
168perform (fetch, push, etc).
169
170Protocol version 2 is stateless by default. This means that all commands
171must only last a single round and be stateless from the perspective of the
172server side, unless the client has requested a capability indicating that
173state should be maintained by the server. Clients MUST NOT require state
174management on the server side in order to function correctly. This
175permits simple round-robin load-balancing on the server side, without
176needing to worry about state management.
177
178agent
179~~~~~
180
181The server can advertise the `agent` capability with a value `X` (in the
182form `agent=X`) to notify the client that the server is running version
183`X`. The client may optionally send its own agent string by including
184the `agent` capability with a value `Y` (in the form `agent=Y`) in its
185request to the server (but it MUST NOT do so if the server did not
186advertise the agent capability). The `X` and `Y` strings may contain any
187printable ASCII characters except space (i.e., the byte range 33 <= x <=
188126), and are typically of the form "package/version-os" (e.g.,
189"git/1.8.3.1-Linux") where `os` is the operating system name (e.g.,
190"Linux"). `X` and `Y` can be configured using the GIT_USER_AGENT
191environment variable and it takes priority. The `os` is
192retrieved using the 'sysname' field of the `uname(2)` system call
193or its equivalent. The agent strings are purely informative for statistics
194and debugging purposes, and MUST NOT be used to programmatically assume
195the presence or absence of particular features.
196
197ls-refs
198~~~~~~~
199
200`ls-refs` is the command used to request a reference advertisement in v2.
201Unlike the current reference advertisement, ls-refs takes in arguments
202which can be used to limit the refs sent from the server.
203
204Additional features not supported in the base command will be advertised
205as the value of the command in the capability advertisement in the form
206of a space separated list of features: "<command>=<feature-1> <feature-2>"
207
208ls-refs takes in the following arguments:
209
210 symrefs
211 In addition to the object pointed by it, show the underlying ref
212 pointed by it when showing a symbolic ref.
213 peel
214 Show peeled tags.
215 ref-prefix <prefix>
216 When specified, only references having a prefix matching one of
217 the provided prefixes are displayed. Multiple instances may be
218 given, in which case references matching any prefix will be
219 shown. Note that this is purely for optimization; a server MAY
220 show refs not matching the prefix if it chooses, and clients
221 should filter the result themselves.
222
223If the 'unborn' feature is advertised the following argument can be
224included in the client's request.
225
226 unborn
227 The server will send information about HEAD even if it is a symref
228 pointing to an unborn branch in the form "unborn HEAD
229 symref-target:<target>".
230
231The output of ls-refs is as follows:
232
233 output = *ref
234 flush-pkt
235 obj-id-or-unborn = (obj-id | "unborn")
236 ref = PKT-LINE(obj-id-or-unborn SP refname *(SP ref-attribute) LF)
237 ref-attribute = (symref | peeled)
238 symref = "symref-target:" symref-target
239 peeled = "peeled:" obj-id
240
241fetch
242~~~~~
243
244`fetch` is the command used to fetch a packfile in v2. It can be looked
245at as a modified version of the v1 fetch where the ref-advertisement is
246stripped out (since the `ls-refs` command fills that role) and the
247message format is tweaked to eliminate redundancies and permit easy
248addition of future extensions.
249
250Additional features not supported in the base command will be advertised
251as the value of the command in the capability advertisement in the form
252of a space separated list of features: "<command>=<feature-1> <feature-2>"
253
254A `fetch` request can take the following arguments:
255
256 want <oid>
257 Indicates to the server an object which the client wants to
258 retrieve. Wants can be anything and are not limited to
259 advertised objects.
260
261 have <oid>
262 Indicates to the server an object which the client has locally.
263 This allows the server to make a packfile which only contains
264 the objects that the client needs. Multiple 'have' lines can be
265 supplied.
266
267 done
268 Indicates to the server that negotiation should terminate (or
269 not even begin if performing a clone) and that the server should
270 use the information supplied in the request to construct the
271 packfile.
272
273 thin-pack
274 Request that a thin pack be sent, which is a pack with deltas
275 which reference base objects not contained within the pack (but
276 are known to exist at the receiving end). This can reduce the
277 network traffic significantly, but it requires the receiving end
278 to know how to "thicken" these packs by adding the missing bases
279 to the pack.
280
281 no-progress
282 Request that progress information that would normally be sent on
283 side-band channel 2, during the packfile transfer, should not be
284 sent. However, the side-band channel 3 is still used for error
285 responses.
286
287 include-tag
288 Request that annotated tags should be sent if the objects they
289 point to are being sent.
290
291 ofs-delta
292 Indicate that the client understands PACKv2 with delta referring
293 to its base by position in pack rather than by an oid. That is,
294 they can read OBJ_OFS_DELTA (aka type 6) in a packfile.
295
296If the 'shallow' feature is advertised the following arguments can be
297included in the clients request as well as the potential addition of the
298'shallow-info' section in the server's response as explained below.
299
300 shallow <oid>
301 A client must notify the server of all commits for which it only
302 has shallow copies (meaning that it doesn't have the parents of
303 a commit) by supplying a 'shallow <oid>' line for each such
304 object so that the server is aware of the limitations of the
305 client's history. This is so that the server is aware that the
306 client may not have all objects reachable from such commits.
307
308 deepen <depth>
309 Requests that the fetch/clone should be shallow having a commit
310 depth of <depth> relative to the remote side.
311
312 deepen-relative
313 Requests that the semantics of the "deepen" command be changed
314 to indicate that the depth requested is relative to the client's
315 current shallow boundary, instead of relative to the requested
316 commits.
317
318 deepen-since <timestamp>
319 Requests that the shallow clone/fetch should be cut at a
320 specific time, instead of depth. Internally it's equivalent to
321 doing "git rev-list --max-age=<timestamp>". Cannot be used with
322 "deepen".
323
324 deepen-not <rev>
325 Requests that the shallow clone/fetch should be cut at a
326 specific revision specified by '<rev>', instead of a depth.
327 Internally it's equivalent of doing "git rev-list --not <rev>".
328 Cannot be used with "deepen", but can be used with
329 "deepen-since".
330
331If the 'filter' feature is advertised, the following argument can be
332included in the client's request:
333
334 filter <filter-spec>
335 Request that various objects from the packfile be omitted
336 using one of several filtering techniques. These are intended
337 for use with partial clone and partial fetch operations. See
338 `rev-list` for possible "filter-spec" values. When communicating
339 with other processes, senders SHOULD translate scaled integers
340 (e.g. "1k") into a fully-expanded form (e.g. "1024") to aid
341 interoperability with older receivers that may not understand
342 newly-invented scaling suffixes. However, receivers SHOULD
343 accept the following suffixes: 'k', 'm', and 'g' for 1024,
344 1048576, and 1073741824, respectively.
345
346If the 'ref-in-want' feature is advertised, the following argument can
347be included in the client's request as well as the potential addition of
348the 'wanted-refs' section in the server's response as explained below.
349
350 want-ref <ref>
351 Indicates to the server that the client wants to retrieve a
352 particular ref, where <ref> is the full name of a ref on the
353 server. It is a protocol error to send want-ref for the
354 same ref more than once.
355
356If the 'sideband-all' feature is advertised, the following argument can be
357included in the client's request:
358
359 sideband-all
360 Instruct the server to send the whole response multiplexed, not just
361 the packfile section. All non-flush and non-delim PKT-LINE in the
362 response (not only in the packfile section) will then start with a byte
363 indicating its sideband (1, 2, or 3), and the server may send "0005\2"
364 (a PKT-LINE of sideband 2 with no payload) as a keepalive packet.
365
366If the 'packfile-uris' feature is advertised, the following argument
367can be included in the client's request as well as the potential
368addition of the 'packfile-uris' section in the server's response as
369explained below. Note that at most one `packfile-uris` line can be sent
370to the server.
371
372 packfile-uris <comma-separated-list-of-protocols>
373 Indicates to the server that the client is willing to receive
374 URIs of any of the given protocols in place of objects in the
375 sent packfile. Before performing the connectivity check, the
376 client should download from all given URIs. Currently, the
377 protocols supported are "http" and "https".
378
379If the 'wait-for-done' feature is advertised, the following argument
380can be included in the client's request.
381
382 wait-for-done
383 Indicates to the server that it should never send "ready", but
384 should wait for the client to say "done" before sending the
385 packfile.
386
387The response of `fetch` is broken into a number of sections separated by
388delimiter packets (0001), with each section beginning with its section
389header. Most sections are sent only when the packfile is sent.
390
391 output = acknowledgements flush-pkt |
392 [acknowledgments delim-pkt] [shallow-info delim-pkt]
393 [wanted-refs delim-pkt] [packfile-uris delim-pkt]
394 packfile flush-pkt
395
396 acknowledgments = PKT-LINE("acknowledgments" LF)
397 (nak | *ack)
398 (ready)
399 ready = PKT-LINE("ready" LF)
400 nak = PKT-LINE("NAK" LF)
401 ack = PKT-LINE("ACK" SP obj-id LF)
402
403 shallow-info = PKT-LINE("shallow-info" LF)
404 *PKT-LINE((shallow | unshallow) LF)
405 shallow = "shallow" SP obj-id
406 unshallow = "unshallow" SP obj-id
407
408 wanted-refs = PKT-LINE("wanted-refs" LF)
409 *PKT-LINE(wanted-ref LF)
410 wanted-ref = obj-id SP refname
411
412 packfile-uris = PKT-LINE("packfile-uris" LF) *packfile-uri
413 packfile-uri = PKT-LINE(40*(HEXDIGIT) SP *%x20-ff LF)
414
415 packfile = PKT-LINE("packfile" LF)
416 *PKT-LINE(%x01-03 *%x00-ff)
417
418 acknowledgments section
419 * If the client determines that it is finished with negotiations by
420 sending a "done" line (thus requiring the server to send a packfile),
421 the acknowledgments sections MUST be omitted from the server's
422 response.
423
424 * Always begins with the section header "acknowledgments"
425
426 * The server will respond with "NAK" if none of the object ids sent
427 as have lines were common.
428
429 * The server will respond with "ACK obj-id" for all of the
430 object ids sent as have lines which are common.
431
432 * A response cannot have both "ACK" lines as well as a "NAK"
433 line.
434
435 * The server will respond with a "ready" line indicating that
436 the server has found an acceptable common base and is ready to
437 make and send a packfile (which will be found in the packfile
438 section of the same response)
439
440 * If the server has found a suitable cut point and has decided
441 to send a "ready" line, then the server can decide to (as an
442 optimization) omit any "ACK" lines it would have sent during
443 its response. This is because the server will have already
444 determined the objects it plans to send to the client and no
445 further negotiation is needed.
446
447 shallow-info section
448 * If the client has requested a shallow fetch/clone, a shallow
449 client requests a fetch or the server is shallow then the
450 server's response may include a shallow-info section. The
451 shallow-info section will be included if (due to one of the
452 above conditions) the server needs to inform the client of any
453 shallow boundaries or adjustments to the clients already
454 existing shallow boundaries.
455
456 * Always begins with the section header "shallow-info"
457
458 * If a positive depth is requested, the server will compute the
459 set of commits which are no deeper than the desired depth.
460
461 * The server sends a "shallow obj-id" line for each commit whose
462 parents will not be sent in the following packfile.
463
464 * The server sends an "unshallow obj-id" line for each commit
465 which the client has indicated is shallow, but is no longer
466 shallow as a result of the fetch (due to its parents being
467 sent in the following packfile).
468
469 * The server MUST NOT send any "unshallow" lines for anything
470 which the client has not indicated was shallow as a part of
471 its request.
472
473 wanted-refs section
474 * This section is only included if the client has requested a
475 ref using a 'want-ref' line and if a packfile section is also
476 included in the response.
477
478 * Always begins with the section header "wanted-refs".
479
480 * The server will send a ref listing ("<oid> <refname>") for
481 each reference requested using 'want-ref' lines.
482
483 * The server MUST NOT send any refs which were not requested
484 using 'want-ref' lines.
485
486 packfile-uris section
487 * This section is only included if the client sent
488 'packfile-uris' and the server has at least one such URI to
489 send.
490
491 * Always begins with the section header "packfile-uris".
492
493 * For each URI the server sends, it sends a hash of the pack's
494 contents (as output by git index-pack) followed by the URI.
495
496 * The hashes are 40 hex characters long. When Git upgrades to a new
497 hash algorithm, this might need to be updated. (It should match
498 whatever index-pack outputs after "pack\t" or "keep\t".
499
500 packfile section
501 * This section is only included if the client has sent 'want'
502 lines in its request and either requested that no more
503 negotiation be done by sending 'done' or if the server has
504 decided it has found a sufficient cut point to produce a
505 packfile.
506
507 * Always begins with the section header "packfile"
508
509 * The transmission of the packfile begins immediately after the
510 section header
511
512 * The data transfer of the packfile is always multiplexed, using
513 the same semantics of the 'side-band-64k' capability from
514 protocol version 1. This means that each packet, during the
515 packfile data stream, is made up of a leading 4-byte pkt-line
516 length (typical of the pkt-line format), followed by a 1-byte
517 stream code, followed by the actual data.
518
519 The stream code can be one of:
520 1 - pack data
521 2 - progress messages
522 3 - fatal error message just before stream aborts
523
524server-option
525~~~~~~~~~~~~~
526
527If advertised, indicates that any number of server specific options can be
528included in a request. This is done by sending each option as a
529"server-option=<option>" capability line in the capability-list section of
530a request.
531
532The provided options must not contain a NUL or LF character.
533
534object-format
535~~~~~~~~~~~~~
536
537The server can advertise the `object-format` capability with a value `X` (in the
538form `object-format=X`) to notify the client that the server is able to deal
539with objects using hash algorithm X. If not specified, the server is assumed to
540only handle SHA-1. If the client would like to use a hash algorithm other than
541SHA-1, it should specify its object-format string.
542
543session-id=<session-id>
544~~~~~~~~~~~~~~~~~~~~~~~
545
546The server may advertise a session ID that can be used to identify this process
547across multiple requests. The client may advertise its own session ID back to
548the server as well.
549
550Session IDs should be unique to a given process. They must fit within a
551packet-line, and must not contain non-printable or whitespace characters. The
552current implementation uses trace2 session IDs (see
553link:technical/api-trace2.html[api-trace2] for details), but this may change
554and users of the session ID should not rely on this fact.
555
556object-info
557~~~~~~~~~~~
558
559`object-info` is the command to retrieve information about one or more objects.
560Its main purpose is to allow a client to make decisions based on this
561information without having to fully fetch objects. Object size is the only
562information that is currently supported.
563
564An `object-info` request takes the following arguments:
565
566 size
567 Requests size information to be returned for each listed object id.
568
569 oid <oid>
570 Indicates to the server an object which the client wants to obtain
571 information for.
572
573The response of `object-info` is a list of the requested object ids
574and associated requested information, each separated by a single space.
575
576 output = info flush-pkt
577
578 info = PKT-LINE(attrs) LF)
579 *PKT-LINE(obj-info LF)
580
581 attrs = attr | attrs SP attrs
582
583 attr = "size"
584
585 obj-info = obj-id SP obj-size
586
587bundle-uri
588~~~~~~~~~~
589
590If the 'bundle-uri' capability is advertised, the server supports the
591`bundle-uri' command.
592
593The capability is currently advertised with no value (i.e. not
594"bundle-uri=somevalue"), a value may be added in the future for
595supporting command-wide extensions. Clients MUST ignore any unknown
596capability values and proceed with the 'bundle-uri` dialog they
597support.
598
599The 'bundle-uri' command is intended to be issued before `fetch` to
600get URIs to bundle files (see linkgit:git-bundle[1]) to "seed" and
601inform the subsequent `fetch` command.
602
603The client CAN issue `bundle-uri` before or after any other valid
604command. To be useful to clients it's expected that it'll be issued
605after an `ls-refs` and before `fetch`, but CAN be issued at any time
606in the dialog.
607
608DISCUSSION of bundle-uri
609^^^^^^^^^^^^^^^^^^^^^^^^
610
611The intent of the feature is optimize for server resource consumption
612in the common case by changing the common case of fetching a very
613large PACK during linkgit:git-clone[1] into a smaller incremental
614fetch.
615
616It also allows servers to achieve better caching in combination with
617an `uploadpack.packObjectsHook` (see linkgit:git-config[1]).
618
619By having new clones or fetches be a more predictable and common
620negotiation against the tips of recently produces *.bundle file(s).
621Servers might even pre-generate the results of such negotiations for
622the `uploadpack.packObjectsHook` as new pushes come in.
623
624One way that servers could take advantage of these bundles is that the
625server would anticipate that fresh clones will download a known bundle,
626followed by catching up to the current state of the repository using ref
627tips found in that bundle (or bundles).
628
629PROTOCOL for bundle-uri
630^^^^^^^^^^^^^^^^^^^^^^^
631
632A `bundle-uri` request takes no arguments, and as noted above does not
633currently advertise a capability value. Both may be added in the
634future.
635
636When the client issues a `command=bundle-uri` request, the response is a
637list of key-value pairs provided as packet lines with value
638`<key>=<value>`. Each `<key>` should be interpreted as a config key from
639the `bundle.*` namespace to construct a list of bundles. These keys are
640grouped by a `bundle.<id>.` subsection, where each key corresponding to a
641given `<id>` contributes attributes to the bundle defined by that `<id>`.
642See linkgit:git-config[1] for the specific details of these keys and how
643the Git client will interpret their values.
644
645Clients MUST parse the line according to the above format, lines that do
646not conform to the format SHOULD be discarded. The user MAY be warned in
647such a case.
648
649bundle-uri CLIENT AND SERVER EXPECTATIONS
650^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
651
652URI CONTENTS::
653The content at the advertised URIs MUST be one of two types.
654+
655The advertised URI may contain a bundle file that `git bundle verify`
656would accept. I.e. they MUST contain one or more reference tips for
657use by the client, MUST indicate prerequisites (in any) with standard
658"-" prefixes, and MUST indicate their "object-format", if
659applicable.
660+
661The advertised URI may alternatively contain a plaintext file that `git
662config --list` would accept (with the `--file` option). The key-value
663pairs in this list are in the `bundle.*` namespace (see
664linkgit:git-config[1]).
665
666bundle-uri CLIENT ERROR RECOVERY::
667A client MUST above all gracefully degrade on errors, whether that
668error is because of bad missing/data in the bundle URI(s), because
669that client is too dumb to e.g. understand and fully parse out bundle
670headers and their prerequisite relationships, or something else.
671+
672Server operators should feel confident in turning on "bundle-uri" and
673not worry if e.g. their CDN goes down that clones or fetches will run
674into hard failures. Even if the server bundle(s) are
675incomplete, or bad in some way the client should still end up with a
676functioning repository, just as if it had chosen not to use this
677protocol extension.
678+
679All subsequent discussion on client and server interaction MUST keep
680this in mind.
681
682bundle-uri SERVER TO CLIENT::
683The ordering of the returned bundle uris is not significant. Clients
684MUST parse their headers to discover their contained OIDS and
685prerequisites. A client MUST consider the content of the bundle(s)
686themselves and their header as the ultimate source of truth.
687+
688A server MAY even return bundle(s) that don't have any direct
689relationship to the repository being cloned (either through accident,
690or intentional "clever" configuration), and expect a client to sort
691out what data they'd like from the bundle(s), if any.
692
693bundle-uri CLIENT TO SERVER::
694The client SHOULD provide reference tips found in the bundle header(s)
695as 'have' lines in any subsequent `fetch` request. A client MAY also
696ignore the bundle(s) entirely if doing so is deemed worse for some
697reason, e.g. if the bundles can't be downloaded, it doesn't like the
698tips it finds etc.
699
700WHEN ADVERTISED BUNDLE(S) REQUIRE NO FURTHER NEGOTIATION::
701If after issuing `bundle-uri` and `ls-refs`, and getting the header(s)
702of the bundle(s) the client finds that the ref tips it wants can be
703retrieved entirely from advertised bundle(s), the client MAY disconnect
704from the Git server. The results of such a 'clone' or 'fetch' should be
705indistinguishable from the state attained without using bundle-uri.
706
707EARLY CLIENT DISCONNECTIONS AND ERROR RECOVERY::
708A client MAY perform an early disconnect while still downloading the
709bundle(s) (having streamed and parsed their headers). In such a case
710the client MUST gracefully recover from any errors related to
711finishing the download and validation of the bundle(s).
712+
713I.e. a client might need to re-connect and issue a 'fetch' command,
714and possibly fall back to not making use of 'bundle-uri' at all.
715+
716This "MAY" behavior is specified as such (and not a "SHOULD") on the
717assumption that a server advertising bundle uris is more likely than
718not to be serving up a relatively large repository, and to be pointing
719to URIs that have a good chance of being in working order. A client
720MAY e.g. look at the payload size of the bundles as a heuristic to see
721if an early disconnect is worth it, should falling back on a full
722"fetch" dialog be necessary.
723
724WHEN ADVERTISED BUNDLE(S) REQUIRE FURTHER NEGOTIATION::
725A client SHOULD commence a negotiation of a PACK from the server via
726the "fetch" command using the OID tips found in advertised bundles,
727even if's still in the process of downloading those bundle(s).
728+
729This allows for aggressive early disconnects from any interactive
730server dialog. The client blindly trusts that the advertised OID tips
731are relevant, and issues them as 'have' lines, it then requests any
732tips it would like (usually from the "ls-refs" advertisement) via
733'want' lines. The server will then compute a (hopefully small) PACK
734with the expected difference between the tips from the bundle(s) and
735the data requested.
736+
737The only connection the client then needs to keep active is to the
738concurrently downloading static bundle(s), when those and the
739incremental PACK are retrieved they should be inflated and
740validated. Any errors at this point should be gracefully recovered
741from, see above.
742
743bundle-uri PROTOCOL FEATURES
744^^^^^^^^^^^^^^^^^^^^^^^^^^^^
745
746The client constructs a bundle list from the `<key>=<value>` pairs
747provided by the server. These pairs are part of the `bundle.*` namespace
748as documented in linkgit:git-config[1]. In this section, we discuss some
749of these keys and describe the actions the client will do in response to
750this information.
751
752In particular, the `bundle.version` key specifies an integer value. The
753only accepted value at the moment is `1`, but if the client sees an
754unexpected value here then the client MUST ignore the bundle list.
755
756As long as `bundle.version` is understood, all other unknown keys MAY be
757ignored by the client. The server will guarantee compatibility with older
758clients, though newer clients may be better able to use the extra keys to
759minimize downloads.
760
761Any backwards-incompatible addition of pre-URI key-value will be
762guarded by a new `bundle.version` value or values in 'bundle-uri'
763capability advertisement itself, and/or by new future `bundle-uri`
764request arguments.
765
766Some example key-value pairs that are not currently implemented but could
767be implemented in the future include:
768
769 * Add a "hash=<val>" or "size=<bytes>" advertise the expected hash or
770 size of the bundle file.
771
772 * Advertise that one or more bundle files are the same (to e.g. have
773 clients round-robin or otherwise choose one of N possible files).
774
775 * A "oid=<OID>" shortcut and "prerequisite=<OID>" shortcut. For
776 expressing the common case of a bundle with one tip and no
777 prerequisites, or one tip and one prerequisite.
778+
779This would allow for optimizing the common case of servers who'd like
780to provide one "big bundle" containing only their "main" branch,
781and/or incremental updates thereof.
782+
783A client receiving such a response MAY assume that they can skip
784retrieving the header from a bundle at the indicated URI, and thus
785save themselves and the server(s) the request(s) needed to inspect the
786headers of that bundle or bundles.
787
788promisor-remote=<pr-info>
789~~~~~~~~~~~~~~~~~~~~~~~~~
790
791The server may advertise some promisor remotes it is using or knows
792about to a client which may want to use them as its promisor remotes,
793instead of this repository. In this case <pr-info> should be of the
794form:
795
796 pr-info = pr-fields | pr-info ";" pr-fields
797
798 pr-fields = pr-field | pr-fields "," pr-field
799
800 pr-field = field-name "=" field-value
801
802where all the `field-name` and `field-value` in a given `pr-fields`
803are field names and values related to a single promisor remote. A
804given `field-name` MUST NOT appear more than once in given
805`pr-fields`.
806
807The server MUST advertise at least the "name" and "url" field names
808along with the associated field values, which are the name of a valid
809remote and its URL, in each `pr-fields`. The "name" and "url" fields
810MUST appear first in each pr-fields, in that order.
811
812After these mandatory fields, the server MAY advertise the following
813optional fields in any order:
814
815`partialCloneFilter`:: The filter specification used by the remote.
816Clients can use this to determine if the remote's filtering strategy
817is compatible with their needs (e.g., checking if both use "blob:none").
818It corresponds to the "remote.<name>.partialCloneFilter" config setting.
819
820`token`:: An authentication token that clients can use when
821connecting to the remote. It corresponds to the "remote.<name>.token"
822config setting.
823
824No other fields are defined by the protocol at this time. Field names
825are case-sensitive and MUST be transmitted exactly as specified
826above. Clients MUST ignore fields they don't recognize to allow for
827future protocol extensions.
828
829For now, the client can only use information transmitted through these
830fields to decide if it accepts the advertised promisor remote. In the
831future that information might be used for other purposes though.
832
833Field values MUST be urlencoded.
834
835If the client decides to use one or more promisor remotes the server
836advertised, it can reply with "promisor-remote=<pr-names>" where
837<pr-names> should be of the form:
838
839 pr-names = pr-name | pr-names ";" pr-name
840
841where `pr-name` is the urlencoded name of a promisor remote the server
842advertised and the client accepts.
843
844Note that, everywhere in this document, the ';' and ',' characters
845MUST be encoded if they appear in `pr-name` or `field-value`.
846
847If the server doesn't know any promisor remote that could be good for
848a client to use, or prefers a client not to use any promisor remote it
849uses or knows about, it shouldn't advertise the "promisor-remote"
850capability at all.
851
852In this case, or if the client doesn't want to use any promisor remote
853the server advertised, the client shouldn't advertise the
854"promisor-remote" capability at all in its reply.
855
856On the server side, the "promisor.advertise" and "promisor.sendFields"
857configuration options can be used to control what it advertises. On
858the client side, the "promisor.acceptFromServer" configuration option
859can be used to control what it accepts. See the documentation of these
860configuration options for more information.
861
862Note that in the future it would be nice if the "promisor-remote"
863protocol capability could be used by the server, when responding to
864`git fetch` or `git clone`, to advertise better-connected remotes that
865the client can use as promisor remotes, instead of this repository, so
866that the client can lazily fetch objects from these other
867better-connected remotes. This would require the server to omit in its
868response the objects available on the better-connected remotes that
869the client has accepted. This hasn't been implemented yet though. So
870for now this "promisor-remote" capability is useful only when the
871server advertises some promisor remotes it already uses to borrow
872objects from.
873
874GIT
875---
876Part of the linkgit:git[1] suite