blob: b97acb87a38e4b20c672aaf0ff0e3ec13b98216d [file] [log] [blame]
Junio C Hamanoccb82522018-05-08 07:52:091<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
5<head>
6<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
Junio C Hamano98c882d2020-08-13 22:06:577<meta name="generator" content="AsciiDoc 9.0.0rc2" />
Junio C Hamanob5513772019-04-22 03:38:398<title>Git Wire Protocol, Version 2</title>
Junio C Hamanoccb82522018-05-08 07:52:099<style type="text/css">
10/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
11
12/* Default font. */
13body {
14 font-family: Georgia,serif;
15}
16
17/* Title font. */
18h1, h2, h3, h4, h5, h6,
19div.title, caption.title,
20thead, p.table.header,
21#toctitle,
22#author, #revnumber, #revdate, #revremark,
23#footer {
24 font-family: Arial,Helvetica,sans-serif;
25}
26
27body {
28 margin: 1em 5% 1em 5%;
29}
30
31a {
32 color: blue;
33 text-decoration: underline;
34}
35a:visited {
36 color: fuchsia;
37}
38
39em {
40 font-style: italic;
41 color: navy;
42}
43
44strong {
45 font-weight: bold;
46 color: #083194;
47}
48
49h1, h2, h3, h4, h5, h6 {
50 color: #527bbd;
51 margin-top: 1.2em;
52 margin-bottom: 0.5em;
53 line-height: 1.3;
54}
55
56h1, h2, h3 {
57 border-bottom: 2px solid silver;
58}
59h2 {
60 padding-top: 0.5em;
61}
62h3 {
63 float: left;
64}
65h3 + * {
66 clear: left;
67}
68h5 {
69 font-size: 1.0em;
70}
71
72div.sectionbody {
73 margin-left: 0;
74}
75
76hr {
77 border: 1px solid silver;
78}
79
80p {
81 margin-top: 0.5em;
82 margin-bottom: 0.5em;
83}
84
85ul, ol, li > p {
86 margin-top: 0;
87}
88ul > li { color: #aaa; }
89ul > li > * { color: black; }
90
91.monospaced, code, pre {
92 font-family: "Courier New", Courier, monospace;
93 font-size: inherit;
94 color: navy;
95 padding: 0;
96 margin: 0;
97}
98pre {
99 white-space: pre-wrap;
100}
101
102#author {
103 color: #527bbd;
104 font-weight: bold;
105 font-size: 1.1em;
106}
107#email {
108}
109#revnumber, #revdate, #revremark {
110}
111
112#footer {
113 font-size: small;
114 border-top: 2px solid silver;
115 padding-top: 0.5em;
116 margin-top: 4.0em;
117}
118#footer-text {
119 float: left;
120 padding-bottom: 0.5em;
121}
122#footer-badges {
123 float: right;
124 padding-bottom: 0.5em;
125}
126
127#preamble {
128 margin-top: 1.5em;
129 margin-bottom: 1.5em;
130}
131div.imageblock, div.exampleblock, div.verseblock,
132div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133div.admonitionblock {
134 margin-top: 1.0em;
135 margin-bottom: 1.5em;
136}
137div.admonitionblock {
138 margin-top: 2.0em;
139 margin-bottom: 2.0em;
140 margin-right: 10%;
141 color: #606060;
142}
143
144div.content { /* Block element content. */
145 padding: 0;
146}
147
148/* Block element titles. */
149div.title, caption.title {
150 color: #527bbd;
151 font-weight: bold;
152 text-align: left;
153 margin-top: 1.0em;
154 margin-bottom: 0.5em;
155}
156div.title + * {
157 margin-top: 0;
158}
159
160td div.title:first-child {
161 margin-top: 0.0em;
162}
163div.content div.title:first-child {
164 margin-top: 0.0em;
165}
166div.content + div.title {
167 margin-top: 0.0em;
168}
169
170div.sidebarblock > div.content {
171 background: #ffffee;
172 border: 1px solid #dddddd;
173 border-left: 4px solid #f0f0f0;
174 padding: 0.5em;
175}
176
177div.listingblock > div.content {
178 border: 1px solid #dddddd;
179 border-left: 5px solid #f0f0f0;
180 background: #f8f8f8;
181 padding: 0.5em;
182}
183
184div.quoteblock, div.verseblock {
185 padding-left: 1.0em;
186 margin-left: 1.0em;
187 margin-right: 10%;
188 border-left: 5px solid #f0f0f0;
189 color: #888;
190}
191
192div.quoteblock > div.attribution {
193 padding-top: 0.5em;
194 text-align: right;
195}
196
197div.verseblock > pre.content {
198 font-family: inherit;
199 font-size: inherit;
200}
201div.verseblock > div.attribution {
202 padding-top: 0.75em;
203 text-align: left;
204}
205/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
206div.verseblock + div.attribution {
207 text-align: left;
208}
209
210div.admonitionblock .icon {
211 vertical-align: top;
212 font-size: 1.1em;
213 font-weight: bold;
214 text-decoration: underline;
215 color: #527bbd;
216 padding-right: 0.5em;
217}
218div.admonitionblock td.content {
219 padding-left: 0.5em;
220 border-left: 3px solid #dddddd;
221}
222
223div.exampleblock > div.content {
224 border-left: 3px solid #dddddd;
225 padding-left: 0.5em;
226}
227
228div.imageblock div.content { padding-left: 0; }
229span.image img { border-style: none; vertical-align: text-bottom; }
230a.image:visited { color: white; }
231
232dl {
233 margin-top: 0.8em;
234 margin-bottom: 0.8em;
235}
236dt {
237 margin-top: 0.5em;
238 margin-bottom: 0;
239 font-style: normal;
240 color: navy;
241}
242dd > *:first-child {
243 margin-top: 0.1em;
244}
245
246ul, ol {
247 list-style-position: outside;
248}
249ol.arabic {
250 list-style-type: decimal;
251}
252ol.loweralpha {
253 list-style-type: lower-alpha;
254}
255ol.upperalpha {
256 list-style-type: upper-alpha;
257}
258ol.lowerroman {
259 list-style-type: lower-roman;
260}
261ol.upperroman {
262 list-style-type: upper-roman;
263}
264
265div.compact ul, div.compact ol,
266div.compact p, div.compact p,
267div.compact div, div.compact div {
268 margin-top: 0.1em;
269 margin-bottom: 0.1em;
270}
271
272tfoot {
273 font-weight: bold;
274}
275td > div.verse {
276 white-space: pre;
277}
278
279div.hdlist {
280 margin-top: 0.8em;
281 margin-bottom: 0.8em;
282}
283div.hdlist tr {
284 padding-bottom: 15px;
285}
286dt.hdlist1.strong, td.hdlist1.strong {
287 font-weight: bold;
288}
289td.hdlist1 {
290 vertical-align: top;
291 font-style: normal;
292 padding-right: 0.8em;
293 color: navy;
294}
295td.hdlist2 {
296 vertical-align: top;
297}
298div.hdlist.compact tr {
299 margin: 0;
300 padding-bottom: 0;
301}
302
303.comment {
304 background: yellow;
305}
306
307.footnote, .footnoteref {
308 font-size: 0.8em;
309}
310
311span.footnote, span.footnoteref {
312 vertical-align: super;
313}
314
315#footnotes {
316 margin: 20px 0 20px 0;
317 padding: 7px 0 0 0;
318}
319
320#footnotes div.footnote {
321 margin: 0 0 5px 0;
322}
323
324#footnotes hr {
325 border: none;
326 border-top: 1px solid silver;
327 height: 1px;
328 text-align: left;
329 margin-left: 0;
330 width: 20%;
331 min-width: 100px;
332}
333
334div.colist td {
335 padding-right: 0.5em;
336 padding-bottom: 0.3em;
337 vertical-align: top;
338}
339div.colist td img {
340 margin-top: 0.3em;
341}
342
343@media print {
344 #footer-badges { display: none; }
345}
346
347#toc {
348 margin-bottom: 2.5em;
349}
350
351#toctitle {
352 color: #527bbd;
353 font-size: 1.1em;
354 font-weight: bold;
355 margin-top: 1.0em;
356 margin-bottom: 0.1em;
357}
358
359div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
360 margin-top: 0;
361 margin-bottom: 0;
362}
363div.toclevel2 {
364 margin-left: 2em;
365 font-size: 0.9em;
366}
367div.toclevel3 {
368 margin-left: 4em;
369 font-size: 0.9em;
370}
371div.toclevel4 {
372 margin-left: 6em;
373 font-size: 0.9em;
374}
375
376span.aqua { color: aqua; }
377span.black { color: black; }
378span.blue { color: blue; }
379span.fuchsia { color: fuchsia; }
380span.gray { color: gray; }
381span.green { color: green; }
382span.lime { color: lime; }
383span.maroon { color: maroon; }
384span.navy { color: navy; }
385span.olive { color: olive; }
386span.purple { color: purple; }
387span.red { color: red; }
388span.silver { color: silver; }
389span.teal { color: teal; }
390span.white { color: white; }
391span.yellow { color: yellow; }
392
393span.aqua-background { background: aqua; }
394span.black-background { background: black; }
395span.blue-background { background: blue; }
396span.fuchsia-background { background: fuchsia; }
397span.gray-background { background: gray; }
398span.green-background { background: green; }
399span.lime-background { background: lime; }
400span.maroon-background { background: maroon; }
401span.navy-background { background: navy; }
402span.olive-background { background: olive; }
403span.purple-background { background: purple; }
404span.red-background { background: red; }
405span.silver-background { background: silver; }
406span.teal-background { background: teal; }
407span.white-background { background: white; }
408span.yellow-background { background: yellow; }
409
410span.big { font-size: 2em; }
411span.small { font-size: 0.6em; }
412
413span.underline { text-decoration: underline; }
414span.overline { text-decoration: overline; }
415span.line-through { text-decoration: line-through; }
416
417div.unbreakable { page-break-inside: avoid; }
418
419
420/*
421 * xhtml11 specific
422 *
423 * */
424
425div.tableblock {
426 margin-top: 1.0em;
427 margin-bottom: 1.5em;
428}
429div.tableblock > table {
430 border: 3px solid #527bbd;
431}
432thead, p.table.header {
433 font-weight: bold;
434 color: #527bbd;
435}
436p.table {
437 margin-top: 0;
438}
Junio C Hamano725b0da2020-01-22 22:02:40439/* Because the table frame attribute is overridden by CSS in most browsers. */
Junio C Hamanoccb82522018-05-08 07:52:09440div.tableblock > table[frame="void"] {
441 border-style: none;
442}
443div.tableblock > table[frame="hsides"] {
444 border-left-style: none;
445 border-right-style: none;
446}
447div.tableblock > table[frame="vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
450}
451
452
453/*
454 * html5 specific
455 *
456 * */
457
458table.tableblock {
459 margin-top: 1.0em;
460 margin-bottom: 1.5em;
461}
462thead, p.tableblock.header {
463 font-weight: bold;
464 color: #527bbd;
465}
466p.tableblock {
467 margin-top: 0;
468}
469table.tableblock {
470 border-width: 3px;
471 border-spacing: 0px;
472 border-style: solid;
473 border-color: #527bbd;
474 border-collapse: collapse;
475}
476th.tableblock, td.tableblock {
477 border-width: 1px;
478 padding: 4px;
479 border-style: solid;
480 border-color: #527bbd;
481}
482
483table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
486}
487table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
490}
491table.tableblock.frame-none {
492 border-style: hidden;
493}
494
495th.tableblock.halign-left, td.tableblock.halign-left {
496 text-align: left;
497}
498th.tableblock.halign-center, td.tableblock.halign-center {
499 text-align: center;
500}
501th.tableblock.halign-right, td.tableblock.halign-right {
502 text-align: right;
503}
504
505th.tableblock.valign-top, td.tableblock.valign-top {
506 vertical-align: top;
507}
508th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
510}
511th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
513}
514
515
516/*
517 * manpage specific
518 *
519 * */
520
521body.manpage h1 {
522 padding-top: 0.5em;
523 padding-bottom: 0.5em;
524 border-top: 2px solid silver;
525 border-bottom: 2px solid silver;
526}
527body.manpage h2 {
528 border-style: none;
529}
530body.manpage div.sectionbody {
531 margin-left: 3em;
532}
533
534@media print {
535 body.manpage div#toc { display: none; }
536}
537
538
539</style>
540<script type="text/javascript">
541/*<![CDATA[*/
542var asciidoc = { // Namespace.
543
544/////////////////////////////////////////////////////////////////////
545// Table Of Contents generator
546/////////////////////////////////////////////////////////////////////
547
548/* Author: Mihai Bazon, September 2002
549 * http://students.infoiasi.ro/~mishoo
550 *
551 * Table Of Content generator
552 * Version: 0.4
553 *
554 * Feel free to use this script under the terms of the GNU General Public
555 * License, as long as you do not remove or alter this notice.
556 */
557
558 /* modified by Troy D. Hanson, September 2006. License: GPL */
559 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
560
561// toclevels = 1..4.
562toc: function (toclevels) {
563
564 function getText(el) {
565 var text = "";
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
568 text += i.data;
569 else if (i.firstChild != null)
570 text += getText(i);
571 }
572 return text;
573 }
574
575 function TocEntry(el, text, toclevel) {
576 this.element = el;
577 this.text = text;
578 this.toclevel = toclevel;
579 }
580
581 function tocEntries(el, toclevels) {
582 var result = new Array;
583 var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
584 // Function that scans the DOM tree for header elements (the DOM2
585 // nodeIterator API would be a better technique but not supported by all
586 // browsers).
587 var iterate = function (el) {
588 for (var i = el.firstChild; i != null; i = i.nextSibling) {
589 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
590 var mo = re.exec(i.tagName);
591 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
592 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
593 }
594 iterate(i);
595 }
596 }
597 }
598 iterate(el);
599 return result;
600 }
601
602 var toc = document.getElementById("toc");
603 if (!toc) {
604 return;
605 }
606
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
609 var i;
610 for (i = 0; i < toc.childNodes.length; i++) {
611 var entry = toc.childNodes[i];
612 if (entry.nodeName.toLowerCase() == 'div'
613 && entry.getAttribute("class")
614 && entry.getAttribute("class").match(/^toclevel/))
615 tocEntriesToRemove.push(entry);
616 }
617 for (i = 0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
619 }
620
621 // Rebuild TOC entries.
622 var entries = tocEntries(document.getElementById("content"), toclevels);
623 for (var i = 0; i < entries.length; ++i) {
624 var entry = entries[i];
625 if (entry.element.id == "")
626 entry.element.id = "_toc_" + i;
627 var a = document.createElement("a");
628 a.href = "#" + entry.element.id;
629 a.appendChild(document.createTextNode(entry.text));
630 var div = document.createElement("div");
631 div.appendChild(a);
632 div.className = "toclevel" + entry.toclevel;
633 toc.appendChild(div);
634 }
635 if (entries.length == 0)
636 toc.parentNode.removeChild(toc);
637},
638
639
640/////////////////////////////////////////////////////////////////////
641// Footnotes generator
642/////////////////////////////////////////////////////////////////////
643
644/* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
646 */
647
648footnotes: function () {
649 // Delete existing footnote entries in case we're reloading the footnodes.
650 var i;
651 var noteholder = document.getElementById("footnotes");
652 if (!noteholder) {
653 return;
654 }
655 var entriesToRemove = [];
656 for (i = 0; i < noteholder.childNodes.length; i++) {
657 var entry = noteholder.childNodes[i];
658 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
659 entriesToRemove.push(entry);
660 }
661 for (i = 0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
663 }
664
665 // Rebuild footnote entries.
666 var cont = document.getElementById("content");
667 var spans = cont.getElementsByTagName("span");
668 var refs = {};
669 var n = 0;
670 for (i=0; i<spans.length; i++) {
671 if (spans[i].className == "footnote") {
672 n++;
673 var note = spans[i].getAttribute("data-note");
674 if (!note) {
675 // Use [\s\S] in place of . so multi-line matches work.
676 // Because JavaScript has no s (dotall) regex flag.
677 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
678 spans[i].innerHTML =
679 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
680 "' title='View footnote' class='footnote'>" + n + "</a>]";
681 spans[i].setAttribute("data-note", note);
682 }
683 noteholder.innerHTML +=
684 "<div class='footnote' id='_footnote_" + n + "'>" +
685 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
686 n + "</a>. " + note + "</div>";
687 var id =spans[i].getAttribute("id");
688 if (id != null) refs["#"+id] = n;
689 }
690 }
691 if (n == 0)
692 noteholder.parentNode.removeChild(noteholder);
693 else {
694 // Process footnoterefs.
695 for (i=0; i<spans.length; i++) {
696 if (spans[i].className == "footnoteref") {
697 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
698 href = href.match(/#.*/)[0]; // Because IE return full URL.
699 n = refs[href];
700 spans[i].innerHTML =
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n + "</a>]";
703 }
704 }
705 }
706},
707
708install: function(toclevels) {
709 var timerId;
710
711 function reinstall() {
712 asciidoc.footnotes();
713 if (toclevels) {
714 asciidoc.toc(toclevels);
715 }
716 }
717
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
720 reinstall();
721 }
722
723 timerId = setInterval(reinstall, 500);
724 if (document.addEventListener)
725 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
726 else
727 window.onload = reinstallAndRemoveTimer;
728}
729
730}
731asciidoc.install();
732/*]]>*/
733</script>
734</head>
735<body class="article">
736<div id="header">
Junio C Hamanob5513772019-04-22 03:38:39737<h1>Git Wire Protocol, Version 2</h1>
Junio C Hamanoccb82522018-05-08 07:52:09738</div>
739<div id="content">
740<div id="preamble">
741<div class="sectionbody">
742<div class="paragraph"><p>This document presents a specification for a version 2 of Git&#8217;s wire
743protocol. Protocol v2 will improve upon v1 in the following ways:</p></div>
744<div class="ulist"><ul>
745<li>
746<p>
747Instead of multiple service names, multiple commands will be
748 supported by a single service
749</p>
750</li>
751<li>
752<p>
753Easily extendable as capabilities are moved into their own section
754 of the protocol, no longer being hidden behind a NUL byte and
755 limited by the size of a pkt-line
756</p>
757</li>
758<li>
759<p>
760Separate out other information hidden behind NUL bytes (e.g. agent
761 string as a capability and symrefs can be requested using <em>ls-refs</em>)
762</p>
763</li>
764<li>
765<p>
766Reference advertisement will be omitted unless explicitly requested
767</p>
768</li>
769<li>
770<p>
771ls-refs command to explicitly request some refs
772</p>
773</li>
774<li>
775<p>
776Designed with http and stateless-rpc in mind. With clear flush
777 semantics the http remote helper can simply act as a proxy
778</p>
779</li>
780</ul></div>
781<div class="paragraph"><p>In protocol v2 communication is command oriented. When first contacting a
782server a list of capabilities will advertised. Some of these capabilities
783will be commands which a client can request be executed. Once a command
784has completed, a client can reuse the connection and request that other
785commands be executed.</p></div>
786</div>
787</div>
788<div class="sect1">
Junio C Hamanob5513772019-04-22 03:38:39789<h2 id="_packet_line_framing">Packet-Line Framing</h2>
Junio C Hamanoccb82522018-05-08 07:52:09790<div class="sectionbody">
791<div class="paragraph"><p>All communication is done using packet-line framing, just as in v1. See
792<code>Documentation/technical/pack-protocol.txt</code> and
793<code>Documentation/technical/protocol-common.txt</code> for more information.</p></div>
794<div class="paragraph"><p>In protocol v2 these special packets will have the following semantics:</p></div>
795<div class="ulist"><ul>
796<li>
797<p>
798<em>0000</em> Flush Packet (flush-pkt) - indicates the end of a message
799</p>
800</li>
801<li>
802<p>
803<em>0001</em> Delimiter Packet (delim-pkt) - separates sections of a message
804</p>
805</li>
Junio C Hamano19f41f02020-06-09 01:34:59806<li>
807<p>
808<em>0002</em> Message Packet (response-end-pkt) - indicates the end of a response
809 for stateless connections
810</p>
811</li>
Junio C Hamanoccb82522018-05-08 07:52:09812</ul></div>
813</div>
814</div>
815<div class="sect1">
Junio C Hamanob5513772019-04-22 03:38:39816<h2 id="_initial_client_request">Initial Client Request</h2>
Junio C Hamanoccb82522018-05-08 07:52:09817<div class="sectionbody">
818<div class="paragraph"><p>In general a client can request to speak protocol v2 by sending
819<code>version=2</code> through the respective side-channel for the transport being
820used which inevitably sets <code>GIT_PROTOCOL</code>. More information can be
821found in <code>pack-protocol.txt</code> and <code>http-protocol.txt</code>. In all cases the
822response from the server is the capability advertisement.</p></div>
823<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:39824<h3 id="_git_transport">Git Transport</h3>
Junio C Hamanoccb82522018-05-08 07:52:09825<div class="paragraph"><p>When using the git:// transport, you can request to use protocol v2 by
826sending "version=2" as an extra parameter:</p></div>
827<div class="literalblock">
828<div class="content">
829<pre><code>003egit-upload-pack /project.git\0host=myserver.com\0\0version=2\0</code></pre>
830</div></div>
831</div>
832<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:39833<h3 id="_ssh_and_file_transport">SSH and File Transport</h3>
Junio C Hamanoccb82522018-05-08 07:52:09834<div class="paragraph"><p>When using either the ssh:// or file:// transport, the GIT_PROTOCOL
835environment variable must be set explicitly to include "version=2".</p></div>
836</div>
837<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:39838<h3 id="_http_transport">HTTP Transport</h3>
Junio C Hamanoccb82522018-05-08 07:52:09839<div class="paragraph"><p>When using the http:// or https:// transport a client makes a "smart"
840info/refs request as described in <code>http-protocol.txt</code> and requests that
841v2 be used by supplying "version=2" in the <code>Git-Protocol</code> header.</p></div>
842<div class="literalblock">
843<div class="content">
Junio C Hamanoea1ac8d2018-07-18 20:16:48844<pre><code>C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
845C: Git-Protocol: version=2</code></pre>
Junio C Hamanoccb82522018-05-08 07:52:09846</div></div>
847<div class="paragraph"><p>A v2 server would reply:</p></div>
848<div class="literalblock">
849<div class="content">
850<pre><code>S: 200 OK
851S: &lt;Some headers&gt;
852S: ...
853S:
854S: 000eversion 2\n
855S: &lt;capability-advertisement&gt;</code></pre>
856</div></div>
857<div class="paragraph"><p>Subsequent requests are then made directly to the service
858<code>$GIT_URL/git-upload-pack</code>. (This works the same for git-receive-pack).</p></div>
859</div>
860</div>
861</div>
862<div class="sect1">
Junio C Hamanob5513772019-04-22 03:38:39863<h2 id="_capability_advertisement">Capability Advertisement</h2>
Junio C Hamanoccb82522018-05-08 07:52:09864<div class="sectionbody">
865<div class="paragraph"><p>A server which decides to communicate (based on a request from a client)
866using protocol version 2, notifies the client by sending a version string
867in its initial response followed by an advertisement of its capabilities.
868Each capability is a key with an optional value. Clients must ignore all
869unknown keys. Semantics of unknown values are left to the definition of
870each key. Some capabilities will describe commands which can be requested
871to be executed by the client.</p></div>
872<div class="literalblock">
873<div class="content">
874<pre><code>capability-advertisement = protocol-version
875 capability-list
876 flush-pkt</code></pre>
877</div></div>
878<div class="literalblock">
879<div class="content">
880<pre><code>protocol-version = PKT-LINE("version 2" LF)
881capability-list = *capability
882capability = PKT-LINE(key[=value] LF)</code></pre>
883</div></div>
884<div class="literalblock">
885<div class="content">
886<pre><code>key = 1*(ALPHA | DIGIT | "-_")
887value = 1*(ALPHA | DIGIT | " -_.,?\/{}[]()&lt;&gt;!@#$%^&amp;*+=:;")</code></pre>
888</div></div>
889</div>
890</div>
891<div class="sect1">
Junio C Hamanob5513772019-04-22 03:38:39892<h2 id="_command_request">Command Request</h2>
Junio C Hamanoccb82522018-05-08 07:52:09893<div class="sectionbody">
894<div class="paragraph"><p>After receiving the capability advertisement, a client can then issue a
895request to select the command it wants with any particular capabilities
896or arguments. There is then an optional section where the client can
897provide any command specific parameters or queries. Only a single
898command can be requested at a time.</p></div>
899<div class="literalblock">
900<div class="content">
901<pre><code>request = empty-request | command-request
902empty-request = flush-pkt
903command-request = command
904 capability-list
905 [command-args]
906 flush-pkt
907command = PKT-LINE("command=" key LF)
908command-args = delim-pkt
909 *command-specific-arg</code></pre>
910</div></div>
911<div class="literalblock">
912<div class="content">
913<pre><code>command-specific-args are packet line framed arguments defined by
914each individual command.</code></pre>
915</div></div>
916<div class="paragraph"><p>The server will then check to ensure that the client&#8217;s request is
917comprised of a valid command as well as valid capabilities which were
918advertised. If the request is valid the server will then execute the
919command. A server MUST wait till it has received the client&#8217;s entire
920request before issuing a response. The format of the response is
921determined by the command being executed, but in all cases a flush-pkt
922indicates the end of the response.</p></div>
923<div class="paragraph"><p>When a command has finished, and the client has received the entire
924response from the server, a client can either request that another
925command be executed or can terminate the connection. A client may
926optionally send an empty request consisting of just a flush-pkt to
927indicate that no more requests will be made.</p></div>
928</div>
929</div>
930<div class="sect1">
Junio C Hamanob5513772019-04-22 03:38:39931<h2 id="_capabilities">Capabilities</h2>
Junio C Hamanoccb82522018-05-08 07:52:09932<div class="sectionbody">
933<div class="paragraph"><p>There are two different types of capabilities: normal capabilities,
Junio C Hamano556b57e2019-08-12 17:46:38934which can be used to convey information or alter the behavior of a
Junio C Hamanoccb82522018-05-08 07:52:09935request, and commands, which are the core actions that a client wants to
936perform (fetch, push, etc).</p></div>
937<div class="paragraph"><p>Protocol version 2 is stateless by default. This means that all commands
938must only last a single round and be stateless from the perspective of the
939server side, unless the client has requested a capability indicating that
940state should be maintained by the server. Clients MUST NOT require state
941management on the server side in order to function correctly. This
942permits simple round-robin load-balancing on the server side, without
943needing to worry about state management.</p></div>
944<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:39945<h3 id="_agent">agent</h3>
Junio C Hamanoccb82522018-05-08 07:52:09946<div class="paragraph"><p>The server can advertise the <code>agent</code> capability with a value <code>X</code> (in the
947form <code>agent=X</code>) to notify the client that the server is running version
948<code>X</code>. The client may optionally send its own agent string by including
949the <code>agent</code> capability with a value <code>Y</code> (in the form <code>agent=Y</code>) in its
950request to the server (but it MUST NOT do so if the server did not
951advertise the agent capability). The <code>X</code> and <code>Y</code> strings may contain any
952printable ASCII characters except space (i.e., the byte range 32 &lt; x &lt;
953127), and are typically of the form "package/version" (e.g.,
954"git/1.8.3.1"). The agent strings are purely informative for statistics
955and debugging purposes, and MUST NOT be used to programmatically assume
956the presence or absence of particular features.</p></div>
957</div>
958<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:39959<h3 id="_ls_refs">ls-refs</h3>
Junio C Hamanoccb82522018-05-08 07:52:09960<div class="paragraph"><p><code>ls-refs</code> is the command used to request a reference advertisement in v2.
961Unlike the current reference advertisement, ls-refs takes in arguments
962which can be used to limit the refs sent from the server.</p></div>
963<div class="paragraph"><p>Additional features not supported in the base command will be advertised
964as the value of the command in the capability advertisement in the form
965of a space separated list of features: "&lt;command&gt;=&lt;feature 1&gt; &lt;feature 2&gt;"</p></div>
966<div class="paragraph"><p>ls-refs takes in the following arguments:</p></div>
967<div class="literalblock">
968<div class="content">
969<pre><code>symrefs
970 In addition to the object pointed by it, show the underlying ref
971 pointed by it when showing a symbolic ref.
972peel
973 Show peeled tags.
974ref-prefix &lt;prefix&gt;
975 When specified, only references having a prefix matching one of
976 the provided prefixes are displayed.</code></pre>
977</div></div>
Junio C Hamanoa70c9882021-02-23 00:57:12978<div class="paragraph"><p>If the <em>unborn</em> feature is advertised the following argument can be
979included in the client&#8217;s request.</p></div>
980<div class="literalblock">
981<div class="content">
982<pre><code>unborn
983 The server will send information about HEAD even if it is a symref
984 pointing to an unborn branch in the form "unborn HEAD
985 symref-target:&lt;target&gt;".</code></pre>
986</div></div>
Junio C Hamanoccb82522018-05-08 07:52:09987<div class="paragraph"><p>The output of ls-refs is as follows:</p></div>
988<div class="literalblock">
989<div class="content">
990<pre><code>output = *ref
991 flush-pkt
Junio C Hamanoa70c9882021-02-23 00:57:12992obj-id-or-unborn = (obj-id | "unborn")
993ref = PKT-LINE(obj-id-or-unborn SP refname *(SP ref-attribute) LF)
Junio C Hamanoccb82522018-05-08 07:52:09994ref-attribute = (symref | peeled)
995symref = "symref-target:" symref-target
996peeled = "peeled:" obj-id</code></pre>
997</div></div>
998</div>
999<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:391000<h3 id="_fetch">fetch</h3>
Junio C Hamanoccb82522018-05-08 07:52:091001<div class="paragraph"><p><code>fetch</code> is the command used to fetch a packfile in v2. It can be looked
1002at as a modified version of the v1 fetch where the ref-advertisement is
1003stripped out (since the <code>ls-refs</code> command fills that role) and the
1004message format is tweaked to eliminate redundancies and permit easy
1005addition of future extensions.</p></div>
1006<div class="paragraph"><p>Additional features not supported in the base command will be advertised
1007as the value of the command in the capability advertisement in the form
1008of a space separated list of features: "&lt;command&gt;=&lt;feature 1&gt; &lt;feature 2&gt;"</p></div>
1009<div class="paragraph"><p>A <code>fetch</code> request can take the following arguments:</p></div>
1010<div class="literalblock">
1011<div class="content">
1012<pre><code>want &lt;oid&gt;
1013 Indicates to the server an object which the client wants to
1014 retrieve. Wants can be anything and are not limited to
1015 advertised objects.</code></pre>
1016</div></div>
1017<div class="literalblock">
1018<div class="content">
1019<pre><code>have &lt;oid&gt;
1020 Indicates to the server an object which the client has locally.
1021 This allows the server to make a packfile which only contains
1022 the objects that the client needs. Multiple 'have' lines can be
1023 supplied.</code></pre>
1024</div></div>
1025<div class="literalblock">
1026<div class="content">
1027<pre><code>done
1028 Indicates to the server that negotiation should terminate (or
1029 not even begin if performing a clone) and that the server should
1030 use the information supplied in the request to construct the
1031 packfile.</code></pre>
1032</div></div>
1033<div class="literalblock">
1034<div class="content">
1035<pre><code>thin-pack
1036 Request that a thin pack be sent, which is a pack with deltas
1037 which reference base objects not contained within the pack (but
1038 are known to exist at the receiving end). This can reduce the
1039 network traffic significantly, but it requires the receiving end
1040 to know how to "thicken" these packs by adding the missing bases
1041 to the pack.</code></pre>
1042</div></div>
1043<div class="literalblock">
1044<div class="content">
1045<pre><code>no-progress
1046 Request that progress information that would normally be sent on
1047 side-band channel 2, during the packfile transfer, should not be
1048 sent. However, the side-band channel 3 is still used for error
1049 responses.</code></pre>
1050</div></div>
1051<div class="literalblock">
1052<div class="content">
1053<pre><code>include-tag
1054 Request that annotated tags should be sent if the objects they
1055 point to are being sent.</code></pre>
1056</div></div>
1057<div class="literalblock">
1058<div class="content">
1059<pre><code>ofs-delta
1060 Indicate that the client understands PACKv2 with delta referring
1061 to its base by position in pack rather than by an oid. That is,
Junio C Hamano8ef91f32019-12-01 22:58:271062 they can read OBJ_OFS_DELTA (aka type 6) in a packfile.</code></pre>
Junio C Hamanoccb82522018-05-08 07:52:091063</div></div>
1064<div class="paragraph"><p>If the <em>shallow</em> feature is advertised the following arguments can be
1065included in the clients request as well as the potential addition of the
1066<em>shallow-info</em> section in the server&#8217;s response as explained below.</p></div>
1067<div class="literalblock">
1068<div class="content">
1069<pre><code>shallow &lt;oid&gt;
1070 A client must notify the server of all commits for which it only
1071 has shallow copies (meaning that it doesn't have the parents of
1072 a commit) by supplying a 'shallow &lt;oid&gt;' line for each such
1073 object so that the server is aware of the limitations of the
1074 client's history. This is so that the server is aware that the
1075 client may not have all objects reachable from such commits.</code></pre>
1076</div></div>
1077<div class="literalblock">
1078<div class="content">
1079<pre><code>deepen &lt;depth&gt;
1080 Requests that the fetch/clone should be shallow having a commit
1081 depth of &lt;depth&gt; relative to the remote side.</code></pre>
1082</div></div>
1083<div class="literalblock">
1084<div class="content">
1085<pre><code>deepen-relative
1086 Requests that the semantics of the "deepen" command be changed
1087 to indicate that the depth requested is relative to the client's
1088 current shallow boundary, instead of relative to the requested
1089 commits.</code></pre>
1090</div></div>
1091<div class="literalblock">
1092<div class="content">
1093<pre><code>deepen-since &lt;timestamp&gt;
1094 Requests that the shallow clone/fetch should be cut at a
1095 specific time, instead of depth. Internally it's equivalent to
1096 doing "git rev-list --max-age=&lt;timestamp&gt;". Cannot be used with
1097 "deepen".</code></pre>
1098</div></div>
1099<div class="literalblock">
1100<div class="content">
1101<pre><code>deepen-not &lt;rev&gt;
1102 Requests that the shallow clone/fetch should be cut at a
1103 specific revision specified by '&lt;rev&gt;', instead of a depth.
1104 Internally it's equivalent of doing "git rev-list --not &lt;rev&gt;".
1105 Cannot be used with "deepen", but can be used with
1106 "deepen-since".</code></pre>
1107</div></div>
Junio C Hamano309465b2018-05-30 06:32:591108<div class="paragraph"><p>If the <em>filter</em> feature is advertised, the following argument can be
1109included in the client&#8217;s request:</p></div>
1110<div class="literalblock">
1111<div class="content">
1112<pre><code>filter &lt;filter-spec&gt;
1113 Request that various objects from the packfile be omitted
1114 using one of several filtering techniques. These are intended
1115 for use with partial clone and partial fetch operations. See
Junio C Hamano2567b322019-02-05 23:33:561116 `rev-list` for possible "filter-spec" values. When communicating
1117 with other processes, senders SHOULD translate scaled integers
1118 (e.g. "1k") into a fully-expanded form (e.g. "1024") to aid
1119 interoperability with older receivers that may not understand
1120 newly-invented scaling suffixes. However, receivers SHOULD
1121 accept the following suffixes: 'k', 'm', and 'g' for 1024,
1122 1048576, and 1073741824, respectively.</code></pre>
Junio C Hamano309465b2018-05-30 06:32:591123</div></div>
Junio C Hamano1ff03382018-07-25 22:10:481124<div class="paragraph"><p>If the <em>ref-in-want</em> feature is advertised, the following argument can
1125be included in the client&#8217;s request as well as the potential addition of
1126the <em>wanted-refs</em> section in the server&#8217;s response as explained below.</p></div>
1127<div class="literalblock">
1128<div class="content">
1129<pre><code>want-ref &lt;ref&gt;
1130 Indicates to the server that the client wants to retrieve a
1131 particular ref, where &lt;ref&gt; is the full name of a ref on the
1132 server.</code></pre>
1133</div></div>
Junio C Hamano2567b322019-02-05 23:33:561134<div class="paragraph"><p>If the <em>sideband-all</em> feature is advertised, the following argument can be
1135included in the client&#8217;s request:</p></div>
1136<div class="literalblock">
1137<div class="content">
1138<pre><code>sideband-all
1139 Instruct the server to send the whole response multiplexed, not just
1140 the packfile section. All non-flush and non-delim PKT-LINE in the
1141 response (not only in the packfile section) will then start with a byte
1142 indicating its sideband (1, 2, or 3), and the server may send "0005\2"
1143 (a PKT-LINE of sideband 2 with no payload) as a keepalive packet.</code></pre>
1144</div></div>
Junio C Hamanoa5fefe32020-06-25 21:10:021145<div class="paragraph"><p>If the <em>packfile-uris</em> feature is advertised, the following argument
1146can be included in the client&#8217;s request as well as the potential
1147addition of the <em>packfile-uris</em> section in the server&#8217;s response as
1148explained below.</p></div>
Junio C Hamanoccb82522018-05-08 07:52:091149<div class="literalblock">
1150<div class="content">
Junio C Hamanoa5fefe32020-06-25 21:10:021151<pre><code>packfile-uris &lt;comma-separated list of protocols&gt;
1152 Indicates to the server that the client is willing to receive
1153 URIs of any of the given protocols in place of objects in the
1154 sent packfile. Before performing the connectivity check, the
1155 client should download from all given URIs. Currently, the
1156 protocols supported are "http" and "https".</code></pre>
1157</div></div>
1158<div class="paragraph"><p>The response of <code>fetch</code> is broken into a number of sections separated by
1159delimiter packets (0001), with each section beginning with its section
1160header. Most sections are sent only when the packfile is sent.</p></div>
1161<div class="literalblock">
1162<div class="content">
1163<pre><code>output = acknowledgements flush-pkt |
1164 [acknowledgments delim-pkt] [shallow-info delim-pkt]
1165 [wanted-refs delim-pkt] [packfile-uris delim-pkt]
1166 packfile flush-pkt</code></pre>
Junio C Hamanoccb82522018-05-08 07:52:091167</div></div>
1168<div class="literalblock">
1169<div class="content">
1170<pre><code>acknowledgments = PKT-LINE("acknowledgments" LF)
1171 (nak | *ack)
1172 (ready)
1173ready = PKT-LINE("ready" LF)
1174nak = PKT-LINE("NAK" LF)
1175ack = PKT-LINE("ACK" SP obj-id LF)</code></pre>
1176</div></div>
1177<div class="literalblock">
1178<div class="content">
1179<pre><code>shallow-info = PKT-LINE("shallow-info" LF)
1180 *PKT-LINE((shallow | unshallow) LF)
1181shallow = "shallow" SP obj-id
1182unshallow = "unshallow" SP obj-id</code></pre>
1183</div></div>
1184<div class="literalblock">
1185<div class="content">
Junio C Hamano1ff03382018-07-25 22:10:481186<pre><code>wanted-refs = PKT-LINE("wanted-refs" LF)
1187 *PKT-LINE(wanted-ref LF)
1188wanted-ref = obj-id SP refname</code></pre>
1189</div></div>
1190<div class="literalblock">
1191<div class="content">
Junio C Hamanoa5fefe32020-06-25 21:10:021192<pre><code>packfile-uris = PKT-LINE("packfile-uris" LF) *packfile-uri
1193packfile-uri = PKT-LINE(40*(HEXDIGIT) SP *%x20-ff LF)</code></pre>
1194</div></div>
1195<div class="literalblock">
1196<div class="content">
Junio C Hamanoccb82522018-05-08 07:52:091197<pre><code>packfile = PKT-LINE("packfile" LF)
1198 *PKT-LINE(%x01-03 *%x00-ff)</code></pre>
1199</div></div>
1200<div class="literalblock">
1201<div class="content">
1202<pre><code>acknowledgments section
Junio C Hamanoa5fefe32020-06-25 21:10:021203 * If the client determines that it is finished with negotiations by
1204 sending a "done" line (thus requiring the server to send a packfile),
1205 the acknowledgments sections MUST be omitted from the server's
1206 response.</code></pre>
Junio C Hamanoccb82522018-05-08 07:52:091207</div></div>
1208<div class="ulist"><ul>
1209<li>
1210<p>
1211Always begins with the section header "acknowledgments"
1212</p>
1213</li>
1214<li>
1215<p>
1216The server will respond with "NAK" if none of the object ids sent
1217 as have lines were common.
1218</p>
1219</li>
1220<li>
1221<p>
1222The server will respond with "ACK obj-id" for all of the
1223 object ids sent as have lines which are common.
1224</p>
1225</li>
1226<li>
1227<p>
1228A response cannot have both "ACK" lines as well as a "NAK"
1229 line.
1230</p>
1231</li>
1232<li>
1233<p>
1234The server will respond with a "ready" line indicating that
1235 the server has found an acceptable common base and is ready to
1236 make and send a packfile (which will be found in the packfile
1237 section of the same response)
1238</p>
1239</li>
1240<li>
1241<p>
1242If the server has found a suitable cut point and has decided
1243 to send a "ready" line, then the server can decide to (as an
1244 optimization) omit any "ACK" lines it would have sent during
1245 its response. This is because the server will have already
1246 determined the objects it plans to send to the client and no
1247 further negotiation is needed.
1248</p>
1249<div class="literalblock">
1250<div class="content">
1251<pre><code>shallow-info section
1252 * If the client has requested a shallow fetch/clone, a shallow
1253 client requests a fetch or the server is shallow then the
1254 server's response may include a shallow-info section. The
1255 shallow-info section will be included if (due to one of the
1256 above conditions) the server needs to inform the client of any
1257 shallow boundaries or adjustments to the clients already
1258 existing shallow boundaries.</code></pre>
1259</div></div>
1260</li>
1261<li>
1262<p>
1263Always begins with the section header "shallow-info"
1264</p>
1265</li>
1266<li>
1267<p>
1268If a positive depth is requested, the server will compute the
1269 set of commits which are no deeper than the desired depth.
1270</p>
1271</li>
1272<li>
1273<p>
1274The server sends a "shallow obj-id" line for each commit whose
1275 parents will not be sent in the following packfile.
1276</p>
1277</li>
1278<li>
1279<p>
1280The server sends an "unshallow obj-id" line for each commit
1281 which the client has indicated is shallow, but is no longer
1282 shallow as a result of the fetch (due to its parents being
1283 sent in the following packfile).
1284</p>
1285</li>
1286<li>
1287<p>
1288The server MUST NOT send any "unshallow" lines for anything
1289 which the client has not indicated was shallow as a part of
1290 its request.
1291</p>
Junio C Hamanoccb82522018-05-08 07:52:091292<div class="literalblock">
1293<div class="content">
Junio C Hamano1ff03382018-07-25 22:10:481294<pre><code>wanted-refs section
1295 * This section is only included if the client has requested a
1296 ref using a 'want-ref' line and if a packfile section is also
1297 included in the response.</code></pre>
1298</div></div>
1299</li>
1300<li>
1301<p>
1302Always begins with the section header "wanted-refs".
1303</p>
1304</li>
1305<li>
1306<p>
1307The server will send a ref listing ("&lt;oid&gt; &lt;refname&gt;") for
1308 each reference requested using <em>want-ref</em> lines.
1309</p>
1310</li>
1311<li>
1312<p>
1313The server MUST NOT send any refs which were not requested
1314 using <em>want-ref</em> lines.
1315</p>
1316<div class="literalblock">
1317<div class="content">
Junio C Hamanoa5fefe32020-06-25 21:10:021318<pre><code>packfile-uris section
1319 * This section is only included if the client sent
1320 'packfile-uris' and the server has at least one such URI to
1321 send.</code></pre>
1322</div></div>
1323</li>
1324<li>
1325<p>
1326Always begins with the section header "packfile-uris".
1327</p>
1328</li>
1329<li>
1330<p>
1331For each URI the server sends, it sends a hash of the pack&#8217;s
1332 contents (as output by git index-pack) followed by the URI.
1333</p>
1334</li>
1335<li>
1336<p>
1337The hashes are 40 hex characters long. When Git upgrades to a new
1338 hash algorithm, this might need to be updated. (It should match
1339 whatever index-pack outputs after "pack\t" or "keep\t".
1340</p>
1341<div class="literalblock">
1342<div class="content">
Junio C Hamanoccb82522018-05-08 07:52:091343<pre><code>packfile section
1344 * This section is only included if the client has sent 'want'
1345 lines in its request and either requested that no more
1346 negotiation be done by sending 'done' or if the server has
1347 decided it has found a sufficient cut point to produce a
1348 packfile.</code></pre>
1349</div></div>
1350</li>
1351<li>
1352<p>
1353Always begins with the section header "packfile"
1354</p>
1355</li>
1356<li>
1357<p>
1358The transmission of the packfile begins immediately after the
1359 section header
1360</p>
1361</li>
1362<li>
1363<p>
1364The data transfer of the packfile is always multiplexed, using
1365 the same semantics of the <em>side-band-64k</em> capability from
1366 protocol version 1. This means that each packet, during the
1367 packfile data stream, is made up of a leading 4-byte pkt-line
1368 length (typical of the pkt-line format), followed by a 1-byte
1369 stream code, followed by the actual data.
1370</p>
1371<div class="literalblock">
1372<div class="content">
1373<pre><code>The stream code can be one of:
1374 1 - pack data
1375 2 - progress messages
1376 3 - fatal error message just before stream aborts</code></pre>
1377</div></div>
1378</li>
1379</ul></div>
1380</div>
Junio C Hamanob9d9d902018-05-23 07:07:421381<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:391382<h3 id="_server_option">server-option</h3>
Junio C Hamanob9d9d902018-05-23 07:07:421383<div class="paragraph"><p>If advertised, indicates that any number of server specific options can be
1384included in a request. This is done by sending each option as a
1385"server-option=&lt;option&gt;" capability line in the capability-list section of
1386a request.</p></div>
1387<div class="paragraph"><p>The provided options must not contain a NUL or LF character.</p></div>
1388</div>
Junio C Hamanoa8911782020-07-07 05:35:571389<div class="sect2">
1390<h3 id="_object_format"> object-format</h3>
1391<div class="paragraph"><p>The server can advertise the <code>object-format</code> capability with a value <code>X</code> (in the
1392form <code>object-format=X</code>) to notify the client that the server is able to deal
1393with objects using hash algorithm X. If not specified, the server is assumed to
1394only handle SHA-1. If the client would like to use a hash algorithm other than
1395SHA-1, it should specify its object-format string.</p></div>
1396</div>
Junio C Hamano992fbdc2020-12-09 00:14:291397<div class="sect2">
1398<h3 id="_session_id_lt_session_id_gt">session-id=&lt;session id&gt;</h3>
1399<div class="paragraph"><p>The server may advertise a session ID that can be used to identify this process
1400across multiple requests. The client may advertise its own session ID back to
1401the server as well.</p></div>
1402<div class="paragraph"><p>Session IDs should be unique to a given process. They must fit within a
1403packet-line, and must not contain non-printable or whitespace characters. The
1404current implementation uses trace2 session IDs (see
1405<a href="api-trace2.html">api-trace2</a> for details), but this may change and users of
1406the session ID should not rely on this fact.</p></div>
1407</div>
Junio C Hamanoccb82522018-05-08 07:52:091408</div>
1409</div>
1410</div>
1411<div id="footnotes"><hr /></div>
1412<div id="footer">
1413<div id="footer-text">
1414Last updated
Junio C Hamanoa70c9882021-02-23 00:57:121415 2021-02-22 16:54:23 PST
Junio C Hamanoccb82522018-05-08 07:52:091416</div>
1417</div>
1418</body>
1419</html>