| 1 | gitprotocol-v2(5) |
| 2 | ================= |
| 3 | |
| 4 | NAME |
| 5 | ---- |
| 6 | gitprotocol-v2 - Git Wire Protocol, Version 2 |
| 7 | |
| 8 | SYNOPSIS |
| 9 | -------- |
| 10 | [verse] |
| 11 | <over-the-wire-protocol> |
| 12 | |
| 13 | DESCRIPTION |
| 14 | ----------- |
| 15 | |
| 16 | This document presents a specification for a version 2 of Git's wire |
| 17 | protocol. 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 | |
| 31 | In protocol v2 communication is command oriented. When first contacting a |
| 32 | server a list of capabilities will be advertised. Some of these capabilities |
| 33 | will be commands which a client can request be executed. Once a command |
| 34 | has completed, a client can reuse the connection and request that other |
| 35 | commands be executed. |
| 36 | |
| 37 | Packet-Line Framing |
| 38 | ------------------- |
| 39 | |
| 40 | All communication is done using packet-line framing, just as in v1. See |
| 41 | linkgit:gitprotocol-pack[5] and linkgit:gitprotocol-common[5] for more information. |
| 42 | |
| 43 | In 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 | |
| 50 | Initial Client Request |
| 51 | ---------------------- |
| 52 | |
| 53 | In general a client can request to speak protocol v2 by sending |
| 54 | `version=2` through the respective side-channel for the transport being |
| 55 | used which inevitably sets `GIT_PROTOCOL`. More information can be |
| 56 | found 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 |
| 58 | response from the server is the capability advertisement. |
| 59 | |
| 60 | Git Transport |
| 61 | ~~~~~~~~~~~~~ |
| 62 | |
| 63 | When using the git:// transport, you can request to use protocol v2 by |
| 64 | sending "version=2" as an extra parameter: |
| 65 | |
| 66 | 003egit-upload-pack /project.git\0host=myserver.com\0\0version=2\0 |
| 67 | |
| 68 | SSH and File Transport |
| 69 | ~~~~~~~~~~~~~~~~~~~~~~ |
| 70 | |
| 71 | When using either the ssh:// or file:// transport, the GIT_PROTOCOL |
| 72 | environment variable must be set explicitly to include "version=2". |
| 73 | The server may need to be configured to allow this environment variable |
| 74 | to pass. |
| 75 | |
| 76 | HTTP Transport |
| 77 | ~~~~~~~~~~~~~~ |
| 78 | |
| 79 | When using the http:// or https:// transport a client makes a "smart" |
| 80 | info/refs request as described in linkgit:gitprotocol-http[5] and requests that |
| 81 | v2 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 | |
| 86 | A 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 | |
| 95 | Subsequent requests are then made directly to the service |
| 96 | `$GIT_URL/git-upload-pack`. (This works the same for git-receive-pack). |
| 97 | |
| 98 | Uses the `--http-backend-info-refs` option to |
| 99 | linkgit:git-upload-pack[1]. |
| 100 | |
| 101 | The server may need to be configured to pass this header's contents via |
| 102 | the `GIT_PROTOCOL` variable. See the discussion in linkgit:git-http-backend[1]. |
| 103 | |
| 104 | Capability Advertisement |
| 105 | ------------------------ |
| 106 | |
| 107 | A server which decides to communicate (based on a request from a client) |
| 108 | using protocol version 2, notifies the client by sending a version string |
| 109 | in its initial response followed by an advertisement of its capabilities. |
| 110 | Each capability is a key with an optional value. Clients must ignore all |
| 111 | unknown keys. Semantics of unknown values are left to the definition of |
| 112 | each key. Some capabilities will describe commands which can be requested |
| 113 | to 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 | |
| 126 | Command Request |
| 127 | --------------- |
| 128 | |
| 129 | After receiving the capability advertisement, a client can then issue a |
| 130 | request to select the command it wants with any particular capabilities |
| 131 | or arguments. There is then an optional section where the client can |
| 132 | provide any command specific parameters or queries. Only a single |
| 133 | command 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 | |
| 148 | The server will then check to ensure that the client's request is |
| 149 | comprised of a valid command as well as valid capabilities which were |
| 150 | advertised. If the request is valid the server will then execute the |
| 151 | command. A server MUST wait till it has received the client's entire |
| 152 | request before issuing a response. The format of the response is |
| 153 | determined by the command being executed, but in all cases a flush-pkt |
| 154 | indicates the end of the response. |
| 155 | |
| 156 | When a command has finished, and the client has received the entire |
| 157 | response from the server, a client can either request that another |
| 158 | command be executed or can terminate the connection. A client may |
| 159 | optionally send an empty request consisting of just a flush-pkt to |
| 160 | indicate that no more requests will be made. |
| 161 | |
| 162 | Capabilities |
| 163 | ------------ |
| 164 | |
| 165 | There are two different types of capabilities: normal capabilities, |
| 166 | which can be used to convey information or alter the behavior of a |
| 167 | request, and commands, which are the core actions that a client wants to |
| 168 | perform (fetch, push, etc). |
| 169 | |
| 170 | Protocol version 2 is stateless by default. This means that all commands |
| 171 | must only last a single round and be stateless from the perspective of the |
| 172 | server side, unless the client has requested a capability indicating that |
| 173 | state should be maintained by the server. Clients MUST NOT require state |
| 174 | management on the server side in order to function correctly. This |
| 175 | permits simple round-robin load-balancing on the server side, without |
| 176 | needing to worry about state management. |
| 177 | |
| 178 | agent |
| 179 | ~~~~~ |
| 180 | |
| 181 | The server can advertise the `agent` capability with a value `X` (in the |
| 182 | form `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 |
| 184 | the `agent` capability with a value `Y` (in the form `agent=Y`) in its |
| 185 | request to the server (but it MUST NOT do so if the server did not |
| 186 | advertise the agent capability). The `X` and `Y` strings may contain any |
| 187 | printable ASCII characters except space (i.e., the byte range 33 <= x <= |
| 188 | 126), 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 |
| 191 | environment variable and it takes priority. The `os` is |
| 192 | retrieved using the 'sysname' field of the `uname(2)` system call |
| 193 | or its equivalent. The agent strings are purely informative for statistics |
| 194 | and debugging purposes, and MUST NOT be used to programmatically assume |
| 195 | the presence or absence of particular features. |
| 196 | |
| 197 | ls-refs |
| 198 | ~~~~~~~ |
| 199 | |
| 200 | `ls-refs` is the command used to request a reference advertisement in v2. |
| 201 | Unlike the current reference advertisement, ls-refs takes in arguments |
| 202 | which can be used to limit the refs sent from the server. |
| 203 | |
| 204 | Additional features not supported in the base command will be advertised |
| 205 | as the value of the command in the capability advertisement in the form |
| 206 | of a space separated list of features: "<command>=<feature-1> <feature-2>" |
| 207 | |
| 208 | ls-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 | |
| 223 | If the 'unborn' feature is advertised the following argument can be |
| 224 | included 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 | |
| 231 | The 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 | |
| 241 | fetch |
| 242 | ~~~~~ |
| 243 | |
| 244 | `fetch` is the command used to fetch a packfile in v2. It can be looked |
| 245 | at as a modified version of the v1 fetch where the ref-advertisement is |
| 246 | stripped out (since the `ls-refs` command fills that role) and the |
| 247 | message format is tweaked to eliminate redundancies and permit easy |
| 248 | addition of future extensions. |
| 249 | |
| 250 | Additional features not supported in the base command will be advertised |
| 251 | as the value of the command in the capability advertisement in the form |
| 252 | of a space separated list of features: "<command>=<feature-1> <feature-2>" |
| 253 | |
| 254 | A `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 | |
| 296 | If the 'shallow' feature is advertised the following arguments can be |
| 297 | included 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 | |
| 331 | If the 'filter' feature is advertised, the following argument can be |
| 332 | included 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 | |
| 346 | If the 'ref-in-want' feature is advertised, the following argument can |
| 347 | be included in the client's request as well as the potential addition of |
| 348 | the '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 | |
| 356 | If the 'sideband-all' feature is advertised, the following argument can be |
| 357 | included 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 | |
| 366 | If the 'packfile-uris' feature is advertised, the following argument |
| 367 | can be included in the client's request as well as the potential |
| 368 | addition of the 'packfile-uris' section in the server's response as |
| 369 | explained below. Note that at most one `packfile-uris` line can be sent |
| 370 | to 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 | |
| 379 | If the 'wait-for-done' feature is advertised, the following argument |
| 380 | can 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 | |
| 387 | The response of `fetch` is broken into a number of sections separated by |
| 388 | delimiter packets (0001), with each section beginning with its section |
| 389 | header. 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 | |
| 524 | server-option |
| 525 | ~~~~~~~~~~~~~ |
| 526 | |
| 527 | If advertised, indicates that any number of server specific options can be |
| 528 | included in a request. This is done by sending each option as a |
| 529 | "server-option=<option>" capability line in the capability-list section of |
| 530 | a request. |
| 531 | |
| 532 | The provided options must not contain a NUL or LF character. |
| 533 | |
| 534 | object-format |
| 535 | ~~~~~~~~~~~~~ |
| 536 | |
| 537 | The server can advertise the `object-format` capability with a value `X` (in the |
| 538 | form `object-format=X`) to notify the client that the server is able to deal |
| 539 | with objects using hash algorithm X. If not specified, the server is assumed to |
| 540 | only handle SHA-1. If the client would like to use a hash algorithm other than |
| 541 | SHA-1, it should specify its object-format string. |
| 542 | |
| 543 | session-id=<session-id> |
| 544 | ~~~~~~~~~~~~~~~~~~~~~~~ |
| 545 | |
| 546 | The server may advertise a session ID that can be used to identify this process |
| 547 | across multiple requests. The client may advertise its own session ID back to |
| 548 | the server as well. |
| 549 | |
| 550 | Session IDs should be unique to a given process. They must fit within a |
| 551 | packet-line, and must not contain non-printable or whitespace characters. The |
| 552 | current implementation uses trace2 session IDs (see |
| 553 | link:technical/api-trace2.html[api-trace2] for details), but this may change |
| 554 | and users of the session ID should not rely on this fact. |
| 555 | |
| 556 | object-info |
| 557 | ~~~~~~~~~~~ |
| 558 | |
| 559 | `object-info` is the command to retrieve information about one or more objects. |
| 560 | Its main purpose is to allow a client to make decisions based on this |
| 561 | information without having to fully fetch objects. Currently only object size |
| 562 | and type are supported. |
| 563 | |
| 564 | An `object-info` request takes the following arguments: |
| 565 | |
| 566 | size |
| 567 | Requests size information to be returned for each listed object id. |
| 568 | |
| 569 | type |
| 570 | Requests type information to be returned for each listed object id. |
| 571 | |
| 572 | oid <oid> |
| 573 | Indicates to the server an object which the client wants to obtain |
| 574 | information for. They must be full OIDs. |
| 575 | |
| 576 | The response of `object-info` consists of one pkt-line per requested attribute, |
| 577 | echoing the attributes the server will report, followed by one pkt-line per |
| 578 | requested object id with its information, each field separated by a single |
| 579 | space. |
| 580 | |
| 581 | output = info flush-pkt |
| 582 | |
| 583 | info = *PKT-LINE(attr LF) |
| 584 | *PKT-LINE(obj-info LF) |
| 585 | |
| 586 | attr = "size" | "type" |
| 587 | |
| 588 | obj-size = 1*DIGIT |
| 589 | |
| 590 | obj-type = "blob" | "tree" | "commit" | "tag" |
| 591 | |
| 592 | obj-val = obj-size | obj-type |
| 593 | |
| 594 | obj-info = obj-id [SP [obj-val *(SP obj-val)]] |
| 595 | |
| 596 | The values in `obj-info` appear in the same order as the corresponding `attr` |
| 597 | lines, with exactly one value per requested attribute. |
| 598 | |
| 599 | If the server does not recognize the OID, the response will be `<oid> SP` |
| 600 | regardless of the number of attributes requested. |
| 601 | |
| 602 | bundle-uri |
| 603 | ~~~~~~~~~~ |
| 604 | |
| 605 | If the 'bundle-uri' capability is advertised, the server supports the |
| 606 | `bundle-uri' command. |
| 607 | |
| 608 | The capability is currently advertised with no value (i.e. not |
| 609 | "bundle-uri=somevalue"), a value may be added in the future for |
| 610 | supporting command-wide extensions. Clients MUST ignore any unknown |
| 611 | capability values and proceed with the 'bundle-uri` dialog they |
| 612 | support. |
| 613 | |
| 614 | The 'bundle-uri' command is intended to be issued before `fetch` to |
| 615 | get URIs to bundle files (see linkgit:git-bundle[1]) to "seed" and |
| 616 | inform the subsequent `fetch` command. |
| 617 | |
| 618 | The client CAN issue `bundle-uri` before or after any other valid |
| 619 | command. To be useful to clients it's expected that it'll be issued |
| 620 | after an `ls-refs` and before `fetch`, but CAN be issued at any time |
| 621 | in the dialog. |
| 622 | |
| 623 | DISCUSSION of bundle-uri |
| 624 | ^^^^^^^^^^^^^^^^^^^^^^^^ |
| 625 | |
| 626 | The intent of the feature is optimize for server resource consumption |
| 627 | in the common case by changing the common case of fetching a very |
| 628 | large PACK during linkgit:git-clone[1] into a smaller incremental |
| 629 | fetch. |
| 630 | |
| 631 | It also allows servers to achieve better caching in combination with |
| 632 | an `uploadpack.packObjectsHook` (see linkgit:git-config[1]). |
| 633 | |
| 634 | By having new clones or fetches be a more predictable and common |
| 635 | negotiation against the tips of recently produces *.bundle file(s). |
| 636 | Servers might even pre-generate the results of such negotiations for |
| 637 | the `uploadpack.packObjectsHook` as new pushes come in. |
| 638 | |
| 639 | One way that servers could take advantage of these bundles is that the |
| 640 | server would anticipate that fresh clones will download a known bundle, |
| 641 | followed by catching up to the current state of the repository using ref |
| 642 | tips found in that bundle (or bundles). |
| 643 | |
| 644 | PROTOCOL for bundle-uri |
| 645 | ^^^^^^^^^^^^^^^^^^^^^^^ |
| 646 | |
| 647 | A `bundle-uri` request takes no arguments, and as noted above does not |
| 648 | currently advertise a capability value. Both may be added in the |
| 649 | future. |
| 650 | |
| 651 | When the client issues a `command=bundle-uri` request, the response is a |
| 652 | list of key-value pairs provided as packet lines with value |
| 653 | `<key>=<value>`. Each `<key>` should be interpreted as a config key from |
| 654 | the `bundle.*` namespace to construct a list of bundles. These keys are |
| 655 | grouped by a `bundle.<id>.` subsection, where each key corresponding to a |
| 656 | given `<id>` contributes attributes to the bundle defined by that `<id>`. |
| 657 | See linkgit:git-config[1] for the specific details of these keys and how |
| 658 | the Git client will interpret their values. |
| 659 | |
| 660 | Clients MUST parse the line according to the above format, lines that do |
| 661 | not conform to the format SHOULD be discarded. The user MAY be warned in |
| 662 | such a case. |
| 663 | |
| 664 | bundle-uri CLIENT AND SERVER EXPECTATIONS |
| 665 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 666 | |
| 667 | URI CONTENTS:: |
| 668 | The content at the advertised URIs MUST be one of two types. |
| 669 | + |
| 670 | The advertised URI may contain a bundle file that `git bundle verify` |
| 671 | would accept. I.e. they MUST contain one or more reference tips for |
| 672 | use by the client, MUST indicate prerequisites (in any) with standard |
| 673 | "-" prefixes, and MUST indicate their "object-format", if |
| 674 | applicable. |
| 675 | + |
| 676 | The advertised URI may alternatively contain a plaintext file that `git |
| 677 | config list` would accept (with the `--file` option). The key-value |
| 678 | pairs in this list are in the `bundle.*` namespace (see |
| 679 | linkgit:git-config[1]). |
| 680 | |
| 681 | bundle-uri CLIENT ERROR RECOVERY:: |
| 682 | A client MUST above all gracefully degrade on errors, whether that |
| 683 | error is because of bad missing/data in the bundle URI(s), because |
| 684 | that client is too dumb to e.g. understand and fully parse out bundle |
| 685 | headers and their prerequisite relationships, or something else. |
| 686 | + |
| 687 | Server operators should feel confident in turning on "bundle-uri" and |
| 688 | not worry if e.g. their CDN goes down that clones or fetches will run |
| 689 | into hard failures. Even if the server bundle(s) are |
| 690 | incomplete, or bad in some way the client should still end up with a |
| 691 | functioning repository, just as if it had chosen not to use this |
| 692 | protocol extension. |
| 693 | + |
| 694 | All subsequent discussion on client and server interaction MUST keep |
| 695 | this in mind. |
| 696 | |
| 697 | bundle-uri SERVER TO CLIENT:: |
| 698 | The ordering of the returned bundle uris is not significant. Clients |
| 699 | MUST parse their headers to discover their contained OIDS and |
| 700 | prerequisites. A client MUST consider the content of the bundle(s) |
| 701 | themselves and their header as the ultimate source of truth. |
| 702 | + |
| 703 | A server MAY even return bundle(s) that don't have any direct |
| 704 | relationship to the repository being cloned (either through accident, |
| 705 | or intentional "clever" configuration), and expect a client to sort |
| 706 | out what data they'd like from the bundle(s), if any. |
| 707 | |
| 708 | bundle-uri CLIENT TO SERVER:: |
| 709 | The client SHOULD provide reference tips found in the bundle header(s) |
| 710 | as 'have' lines in any subsequent `fetch` request. A client MAY also |
| 711 | ignore the bundle(s) entirely if doing so is deemed worse for some |
| 712 | reason, e.g. if the bundles can't be downloaded, it doesn't like the |
| 713 | tips it finds etc. |
| 714 | |
| 715 | WHEN ADVERTISED BUNDLE(S) REQUIRE NO FURTHER NEGOTIATION:: |
| 716 | If after issuing `bundle-uri` and `ls-refs`, and getting the header(s) |
| 717 | of the bundle(s) the client finds that the ref tips it wants can be |
| 718 | retrieved entirely from advertised bundle(s), the client MAY disconnect |
| 719 | from the Git server. The results of such a 'clone' or 'fetch' should be |
| 720 | indistinguishable from the state attained without using bundle-uri. |
| 721 | |
| 722 | EARLY CLIENT DISCONNECTIONS AND ERROR RECOVERY:: |
| 723 | A client MAY perform an early disconnect while still downloading the |
| 724 | bundle(s) (having streamed and parsed their headers). In such a case |
| 725 | the client MUST gracefully recover from any errors related to |
| 726 | finishing the download and validation of the bundle(s). |
| 727 | + |
| 728 | I.e. a client might need to re-connect and issue a 'fetch' command, |
| 729 | and possibly fall back to not making use of 'bundle-uri' at all. |
| 730 | + |
| 731 | This "MAY" behavior is specified as such (and not a "SHOULD") on the |
| 732 | assumption that a server advertising bundle uris is more likely than |
| 733 | not to be serving up a relatively large repository, and to be pointing |
| 734 | to URIs that have a good chance of being in working order. A client |
| 735 | MAY e.g. look at the payload size of the bundles as a heuristic to see |
| 736 | if an early disconnect is worth it, should falling back on a full |
| 737 | "fetch" dialog be necessary. |
| 738 | |
| 739 | WHEN ADVERTISED BUNDLE(S) REQUIRE FURTHER NEGOTIATION:: |
| 740 | A client SHOULD commence a negotiation of a PACK from the server via |
| 741 | the "fetch" command using the OID tips found in advertised bundles, |
| 742 | even if's still in the process of downloading those bundle(s). |
| 743 | + |
| 744 | This allows for aggressive early disconnects from any interactive |
| 745 | server dialog. The client blindly trusts that the advertised OID tips |
| 746 | are relevant, and issues them as 'have' lines, it then requests any |
| 747 | tips it would like (usually from the "ls-refs" advertisement) via |
| 748 | 'want' lines. The server will then compute a (hopefully small) PACK |
| 749 | with the expected difference between the tips from the bundle(s) and |
| 750 | the data requested. |
| 751 | + |
| 752 | The only connection the client then needs to keep active is to the |
| 753 | concurrently downloading static bundle(s), when those and the |
| 754 | incremental PACK are retrieved they should be inflated and |
| 755 | validated. Any errors at this point should be gracefully recovered |
| 756 | from, see above. |
| 757 | |
| 758 | bundle-uri PROTOCOL FEATURES |
| 759 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 760 | |
| 761 | The client constructs a bundle list from the `<key>=<value>` pairs |
| 762 | provided by the server. These pairs are part of the `bundle.*` namespace |
| 763 | as documented in linkgit:git-config[1]. In this section, we discuss some |
| 764 | of these keys and describe the actions the client will do in response to |
| 765 | this information. |
| 766 | |
| 767 | In particular, the `bundle.version` key specifies an integer value. The |
| 768 | only accepted value at the moment is `1`, but if the client sees an |
| 769 | unexpected value here then the client MUST ignore the bundle list. |
| 770 | |
| 771 | As long as `bundle.version` is understood, all other unknown keys MAY be |
| 772 | ignored by the client. The server will guarantee compatibility with older |
| 773 | clients, though newer clients may be better able to use the extra keys to |
| 774 | minimize downloads. |
| 775 | |
| 776 | Any backwards-incompatible addition of pre-URI key-value will be |
| 777 | guarded by a new `bundle.version` value or values in 'bundle-uri' |
| 778 | capability advertisement itself, and/or by new future `bundle-uri` |
| 779 | request arguments. |
| 780 | |
| 781 | Some example key-value pairs that are not currently implemented but could |
| 782 | be implemented in the future include: |
| 783 | |
| 784 | * Add a "hash=<val>" or "size=<bytes>" advertise the expected hash or |
| 785 | size of the bundle file. |
| 786 | |
| 787 | * Advertise that one or more bundle files are the same (to e.g. have |
| 788 | clients round-robin or otherwise choose one of N possible files). |
| 789 | |
| 790 | * A "oid=<OID>" shortcut and "prerequisite=<OID>" shortcut. For |
| 791 | expressing the common case of a bundle with one tip and no |
| 792 | prerequisites, or one tip and one prerequisite. |
| 793 | + |
| 794 | This would allow for optimizing the common case of servers who'd like |
| 795 | to provide one "big bundle" containing only their "main" branch, |
| 796 | and/or incremental updates thereof. |
| 797 | + |
| 798 | A client receiving such a response MAY assume that they can skip |
| 799 | retrieving the header from a bundle at the indicated URI, and thus |
| 800 | save themselves and the server(s) the request(s) needed to inspect the |
| 801 | headers of that bundle or bundles. |
| 802 | |
| 803 | promisor-remote=<pr-info> |
| 804 | ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 805 | |
| 806 | The server may advertise some promisor remotes it is using or knows |
| 807 | about to a client which may want to use them as its promisor remotes, |
| 808 | instead of this repository. In this case <pr-info> should be of the |
| 809 | form: |
| 810 | |
| 811 | pr-info = pr-fields | pr-info ";" pr-fields |
| 812 | |
| 813 | pr-fields = pr-field | pr-fields "," pr-field |
| 814 | |
| 815 | pr-field = field-name "=" field-value |
| 816 | |
| 817 | where all the `field-name` and `field-value` in a given `pr-fields` |
| 818 | are field names and values related to a single promisor remote. A |
| 819 | given `field-name` MUST NOT appear more than once in given |
| 820 | `pr-fields`. |
| 821 | |
| 822 | The server MUST advertise at least the "name" and "url" field names |
| 823 | along with the associated field values, which are the name of a valid |
| 824 | remote and its URL, in each `pr-fields`. The "name" and "url" fields |
| 825 | MUST appear first in each pr-fields, in that order. |
| 826 | |
| 827 | After these mandatory fields, the server MAY advertise the following |
| 828 | optional fields in any order: |
| 829 | |
| 830 | `partialCloneFilter`:: The filter specification for the remote. It |
| 831 | corresponds to the "remote.<name>.partialCloneFilter" config setting. |
| 832 | Clients can use this to determine if the remote's filtering strategy |
| 833 | is compatible with their needs (e.g., checking if both use |
| 834 | "blob:none"). Additionally they can use this through the |
| 835 | `--filter=auto` option in linkgit:git-clone[1]. With that option, the |
| 836 | filter specification of the clone will be automatically computed by |
| 837 | combining the filter specifications of the promisor remotes the client |
| 838 | accepts. |
| 839 | |
| 840 | `token`:: An authentication token that clients can use when |
| 841 | connecting to the remote. It corresponds to the "remote.<name>.token" |
| 842 | config setting. |
| 843 | |
| 844 | No other fields are defined by the protocol at this time. Field names |
| 845 | are case-sensitive and MUST be transmitted exactly as specified |
| 846 | above. Clients MUST ignore fields they don't recognize to allow for |
| 847 | future protocol extensions. |
| 848 | |
| 849 | The client can use information transmitted through these fields to |
| 850 | decide if it accepts the advertised promisor remote. Also, the client |
| 851 | can be configured to store the values of these fields or use them |
| 852 | to automatically configure the repository (see "promisor.storeFields" |
| 853 | in linkgit:git-config[1] and `--filter=auto` in linkgit:git-clone[1]). |
| 854 | |
| 855 | Field values MUST be urlencoded. |
| 856 | |
| 857 | If the client decides to use one or more promisor remotes the server |
| 858 | advertised, it can reply with "promisor-remote=<pr-names>" where |
| 859 | <pr-names> should be of the form: |
| 860 | |
| 861 | pr-names = pr-name | pr-names ";" pr-name |
| 862 | |
| 863 | where `pr-name` is the urlencoded name of a promisor remote the server |
| 864 | advertised and the client accepts. |
| 865 | |
| 866 | The promisor remotes that the client accepted will be tried before the |
| 867 | other configured promisor remotes when the client attempts to fetch |
| 868 | missing objects. |
| 869 | |
| 870 | Note that, everywhere in this document, the ';' and ',' characters |
| 871 | MUST be encoded if they appear in `pr-name` or `field-value`. |
| 872 | |
| 873 | If the server doesn't know any promisor remote that could be good for |
| 874 | a client to use, or prefers a client not to use any promisor remote it |
| 875 | uses or knows about, it shouldn't advertise the "promisor-remote" |
| 876 | capability at all. |
| 877 | |
| 878 | In this case, or if the client doesn't want to use any promisor remote |
| 879 | the server advertised, the client shouldn't advertise the |
| 880 | "promisor-remote" capability at all in its reply. |
| 881 | |
| 882 | On the server side, the "promisor.advertise" and "promisor.sendFields" |
| 883 | configuration options can be used to control what it advertises. On |
| 884 | the client side, the "promisor.acceptFromServer" and |
| 885 | "promisor.acceptFromServerUrl" configuration options can be used to |
| 886 | control what it accepts, and the "promisor.storeFields" option, to |
| 887 | control what it stores. See the documentation of these configuration |
| 888 | options in linkgit:git-config[1] for more information. |
| 889 | |
| 890 | Note that in the future it would be nice if the "promisor-remote" |
| 891 | protocol capability could be used by the server, when responding to |
| 892 | `git fetch` or `git clone`, to advertise better-connected remotes that |
| 893 | the client can use as promisor remotes, instead of this repository, so |
| 894 | that the client can lazily fetch objects from these other |
| 895 | better-connected remotes. This would require the server to omit in its |
| 896 | response the objects available on the better-connected remotes that |
| 897 | the client has accepted. This hasn't been implemented yet though. So |
| 898 | for now this "promisor-remote" capability is useful only when the |
| 899 | server advertises some promisor remotes it already uses to borrow |
| 900 | objects from. |
| 901 | |
| 902 | GIT |
| 903 | --- |
| 904 | Part of the linkgit:git[1] suite |