blob: abf95212fc875657b4dd4863a56bffb8b9a2340f [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>
978<div class="paragraph"><p>The output of ls-refs is as follows:</p></div>
979<div class="literalblock">
980<div class="content">
981<pre><code>output = *ref
982 flush-pkt
983ref = PKT-LINE(obj-id SP refname *(SP ref-attribute) LF)
984ref-attribute = (symref | peeled)
985symref = "symref-target:" symref-target
986peeled = "peeled:" obj-id</code></pre>
987</div></div>
988</div>
989<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:39990<h3 id="_fetch">fetch</h3>
Junio C Hamanoccb82522018-05-08 07:52:09991<div class="paragraph"><p><code>fetch</code> is the command used to fetch a packfile in v2. It can be looked
992at as a modified version of the v1 fetch where the ref-advertisement is
993stripped out (since the <code>ls-refs</code> command fills that role) and the
994message format is tweaked to eliminate redundancies and permit easy
995addition of future extensions.</p></div>
996<div class="paragraph"><p>Additional features not supported in the base command will be advertised
997as the value of the command in the capability advertisement in the form
998of a space separated list of features: "&lt;command&gt;=&lt;feature 1&gt; &lt;feature 2&gt;"</p></div>
999<div class="paragraph"><p>A <code>fetch</code> request can take the following arguments:</p></div>
1000<div class="literalblock">
1001<div class="content">
1002<pre><code>want &lt;oid&gt;
1003 Indicates to the server an object which the client wants to
1004 retrieve. Wants can be anything and are not limited to
1005 advertised objects.</code></pre>
1006</div></div>
1007<div class="literalblock">
1008<div class="content">
1009<pre><code>have &lt;oid&gt;
1010 Indicates to the server an object which the client has locally.
1011 This allows the server to make a packfile which only contains
1012 the objects that the client needs. Multiple 'have' lines can be
1013 supplied.</code></pre>
1014</div></div>
1015<div class="literalblock">
1016<div class="content">
1017<pre><code>done
1018 Indicates to the server that negotiation should terminate (or
1019 not even begin if performing a clone) and that the server should
1020 use the information supplied in the request to construct the
1021 packfile.</code></pre>
1022</div></div>
1023<div class="literalblock">
1024<div class="content">
1025<pre><code>thin-pack
1026 Request that a thin pack be sent, which is a pack with deltas
1027 which reference base objects not contained within the pack (but
1028 are known to exist at the receiving end). This can reduce the
1029 network traffic significantly, but it requires the receiving end
1030 to know how to "thicken" these packs by adding the missing bases
1031 to the pack.</code></pre>
1032</div></div>
1033<div class="literalblock">
1034<div class="content">
1035<pre><code>no-progress
1036 Request that progress information that would normally be sent on
1037 side-band channel 2, during the packfile transfer, should not be
1038 sent. However, the side-band channel 3 is still used for error
1039 responses.</code></pre>
1040</div></div>
1041<div class="literalblock">
1042<div class="content">
1043<pre><code>include-tag
1044 Request that annotated tags should be sent if the objects they
1045 point to are being sent.</code></pre>
1046</div></div>
1047<div class="literalblock">
1048<div class="content">
1049<pre><code>ofs-delta
1050 Indicate that the client understands PACKv2 with delta referring
1051 to its base by position in pack rather than by an oid. That is,
Junio C Hamano8ef91f32019-12-01 22:58:271052 they can read OBJ_OFS_DELTA (aka type 6) in a packfile.</code></pre>
Junio C Hamanoccb82522018-05-08 07:52:091053</div></div>
1054<div class="paragraph"><p>If the <em>shallow</em> feature is advertised the following arguments can be
1055included in the clients request as well as the potential addition of the
1056<em>shallow-info</em> section in the server&#8217;s response as explained below.</p></div>
1057<div class="literalblock">
1058<div class="content">
1059<pre><code>shallow &lt;oid&gt;
1060 A client must notify the server of all commits for which it only
1061 has shallow copies (meaning that it doesn't have the parents of
1062 a commit) by supplying a 'shallow &lt;oid&gt;' line for each such
1063 object so that the server is aware of the limitations of the
1064 client's history. This is so that the server is aware that the
1065 client may not have all objects reachable from such commits.</code></pre>
1066</div></div>
1067<div class="literalblock">
1068<div class="content">
1069<pre><code>deepen &lt;depth&gt;
1070 Requests that the fetch/clone should be shallow having a commit
1071 depth of &lt;depth&gt; relative to the remote side.</code></pre>
1072</div></div>
1073<div class="literalblock">
1074<div class="content">
1075<pre><code>deepen-relative
1076 Requests that the semantics of the "deepen" command be changed
1077 to indicate that the depth requested is relative to the client's
1078 current shallow boundary, instead of relative to the requested
1079 commits.</code></pre>
1080</div></div>
1081<div class="literalblock">
1082<div class="content">
1083<pre><code>deepen-since &lt;timestamp&gt;
1084 Requests that the shallow clone/fetch should be cut at a
1085 specific time, instead of depth. Internally it's equivalent to
1086 doing "git rev-list --max-age=&lt;timestamp&gt;". Cannot be used with
1087 "deepen".</code></pre>
1088</div></div>
1089<div class="literalblock">
1090<div class="content">
1091<pre><code>deepen-not &lt;rev&gt;
1092 Requests that the shallow clone/fetch should be cut at a
1093 specific revision specified by '&lt;rev&gt;', instead of a depth.
1094 Internally it's equivalent of doing "git rev-list --not &lt;rev&gt;".
1095 Cannot be used with "deepen", but can be used with
1096 "deepen-since".</code></pre>
1097</div></div>
Junio C Hamano309465b2018-05-30 06:32:591098<div class="paragraph"><p>If the <em>filter</em> feature is advertised, the following argument can be
1099included in the client&#8217;s request:</p></div>
1100<div class="literalblock">
1101<div class="content">
1102<pre><code>filter &lt;filter-spec&gt;
1103 Request that various objects from the packfile be omitted
1104 using one of several filtering techniques. These are intended
1105 for use with partial clone and partial fetch operations. See
Junio C Hamano2567b322019-02-05 23:33:561106 `rev-list` for possible "filter-spec" values. When communicating
1107 with other processes, senders SHOULD translate scaled integers
1108 (e.g. "1k") into a fully-expanded form (e.g. "1024") to aid
1109 interoperability with older receivers that may not understand
1110 newly-invented scaling suffixes. However, receivers SHOULD
1111 accept the following suffixes: 'k', 'm', and 'g' for 1024,
1112 1048576, and 1073741824, respectively.</code></pre>
Junio C Hamano309465b2018-05-30 06:32:591113</div></div>
Junio C Hamano1ff03382018-07-25 22:10:481114<div class="paragraph"><p>If the <em>ref-in-want</em> feature is advertised, the following argument can
1115be included in the client&#8217;s request as well as the potential addition of
1116the <em>wanted-refs</em> section in the server&#8217;s response as explained below.</p></div>
1117<div class="literalblock">
1118<div class="content">
1119<pre><code>want-ref &lt;ref&gt;
1120 Indicates to the server that the client wants to retrieve a
1121 particular ref, where &lt;ref&gt; is the full name of a ref on the
1122 server.</code></pre>
1123</div></div>
Junio C Hamano2567b322019-02-05 23:33:561124<div class="paragraph"><p>If the <em>sideband-all</em> feature is advertised, the following argument can be
1125included in the client&#8217;s request:</p></div>
1126<div class="literalblock">
1127<div class="content">
1128<pre><code>sideband-all
1129 Instruct the server to send the whole response multiplexed, not just
1130 the packfile section. All non-flush and non-delim PKT-LINE in the
1131 response (not only in the packfile section) will then start with a byte
1132 indicating its sideband (1, 2, or 3), and the server may send "0005\2"
1133 (a PKT-LINE of sideband 2 with no payload) as a keepalive packet.</code></pre>
1134</div></div>
Junio C Hamanoa5fefe32020-06-25 21:10:021135<div class="paragraph"><p>If the <em>packfile-uris</em> feature is advertised, the following argument
1136can be included in the client&#8217;s request as well as the potential
1137addition of the <em>packfile-uris</em> section in the server&#8217;s response as
1138explained below.</p></div>
Junio C Hamanoccb82522018-05-08 07:52:091139<div class="literalblock">
1140<div class="content">
Junio C Hamanoa5fefe32020-06-25 21:10:021141<pre><code>packfile-uris &lt;comma-separated list of protocols&gt;
1142 Indicates to the server that the client is willing to receive
1143 URIs of any of the given protocols in place of objects in the
1144 sent packfile. Before performing the connectivity check, the
1145 client should download from all given URIs. Currently, the
1146 protocols supported are "http" and "https".</code></pre>
1147</div></div>
1148<div class="paragraph"><p>The response of <code>fetch</code> is broken into a number of sections separated by
1149delimiter packets (0001), with each section beginning with its section
1150header. Most sections are sent only when the packfile is sent.</p></div>
1151<div class="literalblock">
1152<div class="content">
1153<pre><code>output = acknowledgements flush-pkt |
1154 [acknowledgments delim-pkt] [shallow-info delim-pkt]
1155 [wanted-refs delim-pkt] [packfile-uris delim-pkt]
1156 packfile flush-pkt</code></pre>
Junio C Hamanoccb82522018-05-08 07:52:091157</div></div>
1158<div class="literalblock">
1159<div class="content">
1160<pre><code>acknowledgments = PKT-LINE("acknowledgments" LF)
1161 (nak | *ack)
1162 (ready)
1163ready = PKT-LINE("ready" LF)
1164nak = PKT-LINE("NAK" LF)
1165ack = PKT-LINE("ACK" SP obj-id LF)</code></pre>
1166</div></div>
1167<div class="literalblock">
1168<div class="content">
1169<pre><code>shallow-info = PKT-LINE("shallow-info" LF)
1170 *PKT-LINE((shallow | unshallow) LF)
1171shallow = "shallow" SP obj-id
1172unshallow = "unshallow" SP obj-id</code></pre>
1173</div></div>
1174<div class="literalblock">
1175<div class="content">
Junio C Hamano1ff03382018-07-25 22:10:481176<pre><code>wanted-refs = PKT-LINE("wanted-refs" LF)
1177 *PKT-LINE(wanted-ref LF)
1178wanted-ref = obj-id SP refname</code></pre>
1179</div></div>
1180<div class="literalblock">
1181<div class="content">
Junio C Hamanoa5fefe32020-06-25 21:10:021182<pre><code>packfile-uris = PKT-LINE("packfile-uris" LF) *packfile-uri
1183packfile-uri = PKT-LINE(40*(HEXDIGIT) SP *%x20-ff LF)</code></pre>
1184</div></div>
1185<div class="literalblock">
1186<div class="content">
Junio C Hamanoccb82522018-05-08 07:52:091187<pre><code>packfile = PKT-LINE("packfile" LF)
1188 *PKT-LINE(%x01-03 *%x00-ff)</code></pre>
1189</div></div>
1190<div class="literalblock">
1191<div class="content">
1192<pre><code>acknowledgments section
Junio C Hamanoa5fefe32020-06-25 21:10:021193 * If the client determines that it is finished with negotiations by
1194 sending a "done" line (thus requiring the server to send a packfile),
1195 the acknowledgments sections MUST be omitted from the server's
1196 response.</code></pre>
Junio C Hamanoccb82522018-05-08 07:52:091197</div></div>
1198<div class="ulist"><ul>
1199<li>
1200<p>
1201Always begins with the section header "acknowledgments"
1202</p>
1203</li>
1204<li>
1205<p>
1206The server will respond with "NAK" if none of the object ids sent
1207 as have lines were common.
1208</p>
1209</li>
1210<li>
1211<p>
1212The server will respond with "ACK obj-id" for all of the
1213 object ids sent as have lines which are common.
1214</p>
1215</li>
1216<li>
1217<p>
1218A response cannot have both "ACK" lines as well as a "NAK"
1219 line.
1220</p>
1221</li>
1222<li>
1223<p>
1224The server will respond with a "ready" line indicating that
1225 the server has found an acceptable common base and is ready to
1226 make and send a packfile (which will be found in the packfile
1227 section of the same response)
1228</p>
1229</li>
1230<li>
1231<p>
1232If the server has found a suitable cut point and has decided
1233 to send a "ready" line, then the server can decide to (as an
1234 optimization) omit any "ACK" lines it would have sent during
1235 its response. This is because the server will have already
1236 determined the objects it plans to send to the client and no
1237 further negotiation is needed.
1238</p>
1239<div class="literalblock">
1240<div class="content">
1241<pre><code>shallow-info section
1242 * If the client has requested a shallow fetch/clone, a shallow
1243 client requests a fetch or the server is shallow then the
1244 server's response may include a shallow-info section. The
1245 shallow-info section will be included if (due to one of the
1246 above conditions) the server needs to inform the client of any
1247 shallow boundaries or adjustments to the clients already
1248 existing shallow boundaries.</code></pre>
1249</div></div>
1250</li>
1251<li>
1252<p>
1253Always begins with the section header "shallow-info"
1254</p>
1255</li>
1256<li>
1257<p>
1258If a positive depth is requested, the server will compute the
1259 set of commits which are no deeper than the desired depth.
1260</p>
1261</li>
1262<li>
1263<p>
1264The server sends a "shallow obj-id" line for each commit whose
1265 parents will not be sent in the following packfile.
1266</p>
1267</li>
1268<li>
1269<p>
1270The server sends an "unshallow obj-id" line for each commit
1271 which the client has indicated is shallow, but is no longer
1272 shallow as a result of the fetch (due to its parents being
1273 sent in the following packfile).
1274</p>
1275</li>
1276<li>
1277<p>
1278The server MUST NOT send any "unshallow" lines for anything
1279 which the client has not indicated was shallow as a part of
1280 its request.
1281</p>
Junio C Hamanoccb82522018-05-08 07:52:091282<div class="literalblock">
1283<div class="content">
Junio C Hamano1ff03382018-07-25 22:10:481284<pre><code>wanted-refs section
1285 * This section is only included if the client has requested a
1286 ref using a 'want-ref' line and if a packfile section is also
1287 included in the response.</code></pre>
1288</div></div>
1289</li>
1290<li>
1291<p>
1292Always begins with the section header "wanted-refs".
1293</p>
1294</li>
1295<li>
1296<p>
1297The server will send a ref listing ("&lt;oid&gt; &lt;refname&gt;") for
1298 each reference requested using <em>want-ref</em> lines.
1299</p>
1300</li>
1301<li>
1302<p>
1303The server MUST NOT send any refs which were not requested
1304 using <em>want-ref</em> lines.
1305</p>
1306<div class="literalblock">
1307<div class="content">
Junio C Hamanoa5fefe32020-06-25 21:10:021308<pre><code>packfile-uris section
1309 * This section is only included if the client sent
1310 'packfile-uris' and the server has at least one such URI to
1311 send.</code></pre>
1312</div></div>
1313</li>
1314<li>
1315<p>
1316Always begins with the section header "packfile-uris".
1317</p>
1318</li>
1319<li>
1320<p>
1321For each URI the server sends, it sends a hash of the pack&#8217;s
1322 contents (as output by git index-pack) followed by the URI.
1323</p>
1324</li>
1325<li>
1326<p>
1327The hashes are 40 hex characters long. When Git upgrades to a new
1328 hash algorithm, this might need to be updated. (It should match
1329 whatever index-pack outputs after "pack\t" or "keep\t".
1330</p>
1331<div class="literalblock">
1332<div class="content">
Junio C Hamanoccb82522018-05-08 07:52:091333<pre><code>packfile section
1334 * This section is only included if the client has sent 'want'
1335 lines in its request and either requested that no more
1336 negotiation be done by sending 'done' or if the server has
1337 decided it has found a sufficient cut point to produce a
1338 packfile.</code></pre>
1339</div></div>
1340</li>
1341<li>
1342<p>
1343Always begins with the section header "packfile"
1344</p>
1345</li>
1346<li>
1347<p>
1348The transmission of the packfile begins immediately after the
1349 section header
1350</p>
1351</li>
1352<li>
1353<p>
1354The data transfer of the packfile is always multiplexed, using
1355 the same semantics of the <em>side-band-64k</em> capability from
1356 protocol version 1. This means that each packet, during the
1357 packfile data stream, is made up of a leading 4-byte pkt-line
1358 length (typical of the pkt-line format), followed by a 1-byte
1359 stream code, followed by the actual data.
1360</p>
1361<div class="literalblock">
1362<div class="content">
1363<pre><code>The stream code can be one of:
1364 1 - pack data
1365 2 - progress messages
1366 3 - fatal error message just before stream aborts</code></pre>
1367</div></div>
1368</li>
1369</ul></div>
1370</div>
Junio C Hamanob9d9d902018-05-23 07:07:421371<div class="sect2">
Junio C Hamanob5513772019-04-22 03:38:391372<h3 id="_server_option">server-option</h3>
Junio C Hamanob9d9d902018-05-23 07:07:421373<div class="paragraph"><p>If advertised, indicates that any number of server specific options can be
1374included in a request. This is done by sending each option as a
1375"server-option=&lt;option&gt;" capability line in the capability-list section of
1376a request.</p></div>
1377<div class="paragraph"><p>The provided options must not contain a NUL or LF character.</p></div>
1378</div>
Junio C Hamanoa8911782020-07-07 05:35:571379<div class="sect2">
1380<h3 id="_object_format"> object-format</h3>
1381<div class="paragraph"><p>The server can advertise the <code>object-format</code> capability with a value <code>X</code> (in the
1382form <code>object-format=X</code>) to notify the client that the server is able to deal
1383with objects using hash algorithm X. If not specified, the server is assumed to
1384only handle SHA-1. If the client would like to use a hash algorithm other than
1385SHA-1, it should specify its object-format string.</p></div>
1386</div>
Junio C Hamanoccb82522018-05-08 07:52:091387</div>
1388</div>
1389</div>
1390<div id="footnotes"><hr /></div>
1391<div id="footer">
1392<div id="footer-text">
1393Last updated
Junio C Hamanoa8911782020-07-07 05:35:571394 2020-07-06 22:33:22 PDT
Junio C Hamanoccb82522018-05-08 07:52:091395</div>
1396</div>
1397</body>
1398</html>