Autogenerated HTML docs for v2.38.1-175-gdb29e
[git-htmldocs.git] / gitprotocol-v2.html
blob11ed3aa2350b742104789a3666e3154c65a4bea9
1 <?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" />
7 <meta name="generator" content="AsciiDoc 10.2.0" />
8 <title>gitprotocol-v2(5)</title>
9 <style type="text/css">
10 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
12 /* Default font. */
13 body {
14 font-family: Georgia,serif;
17 /* Title font. */
18 h1, h2, h3, h4, h5, h6,
19 div.title, caption.title,
20 thead, p.table.header,
21 #toctitle,
22 #author, #revnumber, #revdate, #revremark,
23 #footer {
24 font-family: Arial,Helvetica,sans-serif;
27 body {
28 margin: 1em 5% 1em 5%;
31 a {
32 color: blue;
33 text-decoration: underline;
35 a:visited {
36 color: fuchsia;
39 em {
40 font-style: italic;
41 color: navy;
44 strong {
45 font-weight: bold;
46 color: #083194;
49 h1, h2, h3, h4, h5, h6 {
50 color: #527bbd;
51 margin-top: 1.2em;
52 margin-bottom: 0.5em;
53 line-height: 1.3;
56 h1, h2, h3 {
57 border-bottom: 2px solid silver;
59 h2 {
60 padding-top: 0.5em;
62 h3 {
63 float: left;
65 h3 + * {
66 clear: left;
68 h5 {
69 font-size: 1.0em;
72 div.sectionbody {
73 margin-left: 0;
76 hr {
77 border: 1px solid silver;
80 p {
81 margin-top: 0.5em;
82 margin-bottom: 0.5em;
85 ul, ol, li > p {
86 margin-top: 0;
88 ul > li { color: #aaa; }
89 ul > li > * { color: black; }
91 .monospaced, code, pre {
92 font-family: "Courier New", Courier, monospace;
93 font-size: inherit;
94 color: navy;
95 padding: 0;
96 margin: 0;
98 pre {
99 white-space: pre-wrap;
102 #author {
103 color: #527bbd;
104 font-weight: bold;
105 font-size: 1.1em;
107 #email {
109 #revnumber, #revdate, #revremark {
112 #footer {
113 font-size: small;
114 border-top: 2px solid silver;
115 padding-top: 0.5em;
116 margin-top: 4.0em;
118 #footer-text {
119 float: left;
120 padding-bottom: 0.5em;
122 #footer-badges {
123 float: right;
124 padding-bottom: 0.5em;
127 #preamble {
128 margin-top: 1.5em;
129 margin-bottom: 1.5em;
131 div.imageblock, div.exampleblock, div.verseblock,
132 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133 div.admonitionblock {
134 margin-top: 1.0em;
135 margin-bottom: 1.5em;
137 div.admonitionblock {
138 margin-top: 2.0em;
139 margin-bottom: 2.0em;
140 margin-right: 10%;
141 color: #606060;
144 div.content { /* Block element content. */
145 padding: 0;
148 /* Block element titles. */
149 div.title, caption.title {
150 color: #527bbd;
151 font-weight: bold;
152 text-align: left;
153 margin-top: 1.0em;
154 margin-bottom: 0.5em;
156 div.title + * {
157 margin-top: 0;
160 td div.title:first-child {
161 margin-top: 0.0em;
163 div.content div.title:first-child {
164 margin-top: 0.0em;
166 div.content + div.title {
167 margin-top: 0.0em;
170 div.sidebarblock > div.content {
171 background: #ffffee;
172 border: 1px solid #dddddd;
173 border-left: 4px solid #f0f0f0;
174 padding: 0.5em;
177 div.listingblock > div.content {
178 border: 1px solid #dddddd;
179 border-left: 5px solid #f0f0f0;
180 background: #f8f8f8;
181 padding: 0.5em;
184 div.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;
192 div.quoteblock > div.attribution {
193 padding-top: 0.5em;
194 text-align: right;
197 div.verseblock > pre.content {
198 font-family: inherit;
199 font-size: inherit;
201 div.verseblock > div.attribution {
202 padding-top: 0.75em;
203 text-align: left;
205 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
206 div.verseblock + div.attribution {
207 text-align: left;
210 div.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;
218 div.admonitionblock td.content {
219 padding-left: 0.5em;
220 border-left: 3px solid #dddddd;
223 div.exampleblock > div.content {
224 border-left: 3px solid #dddddd;
225 padding-left: 0.5em;
228 div.imageblock div.content { padding-left: 0; }
229 span.image img { border-style: none; vertical-align: text-bottom; }
230 a.image:visited { color: white; }
232 dl {
233 margin-top: 0.8em;
234 margin-bottom: 0.8em;
236 dt {
237 margin-top: 0.5em;
238 margin-bottom: 0;
239 font-style: normal;
240 color: navy;
242 dd > *:first-child {
243 margin-top: 0.1em;
246 ul, ol {
247 list-style-position: outside;
249 ol.arabic {
250 list-style-type: decimal;
252 ol.loweralpha {
253 list-style-type: lower-alpha;
255 ol.upperalpha {
256 list-style-type: upper-alpha;
258 ol.lowerroman {
259 list-style-type: lower-roman;
261 ol.upperroman {
262 list-style-type: upper-roman;
265 div.compact ul, div.compact ol,
266 div.compact p, div.compact p,
267 div.compact div, div.compact div {
268 margin-top: 0.1em;
269 margin-bottom: 0.1em;
272 tfoot {
273 font-weight: bold;
275 td > div.verse {
276 white-space: pre;
279 div.hdlist {
280 margin-top: 0.8em;
281 margin-bottom: 0.8em;
283 div.hdlist tr {
284 padding-bottom: 15px;
286 dt.hdlist1.strong, td.hdlist1.strong {
287 font-weight: bold;
289 td.hdlist1 {
290 vertical-align: top;
291 font-style: normal;
292 padding-right: 0.8em;
293 color: navy;
295 td.hdlist2 {
296 vertical-align: top;
298 div.hdlist.compact tr {
299 margin: 0;
300 padding-bottom: 0;
303 .comment {
304 background: yellow;
307 .footnote, .footnoteref {
308 font-size: 0.8em;
311 span.footnote, span.footnoteref {
312 vertical-align: super;
315 #footnotes {
316 margin: 20px 0 20px 0;
317 padding: 7px 0 0 0;
320 #footnotes div.footnote {
321 margin: 0 0 5px 0;
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;
334 div.colist td {
335 padding-right: 0.5em;
336 padding-bottom: 0.3em;
337 vertical-align: top;
339 div.colist td img {
340 margin-top: 0.3em;
343 @media print {
344 #footer-badges { display: none; }
347 #toc {
348 margin-bottom: 2.5em;
351 #toctitle {
352 color: #527bbd;
353 font-size: 1.1em;
354 font-weight: bold;
355 margin-top: 1.0em;
356 margin-bottom: 0.1em;
359 div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
360 margin-top: 0;
361 margin-bottom: 0;
363 div.toclevel2 {
364 margin-left: 2em;
365 font-size: 0.9em;
367 div.toclevel3 {
368 margin-left: 4em;
369 font-size: 0.9em;
371 div.toclevel4 {
372 margin-left: 6em;
373 font-size: 0.9em;
376 span.aqua { color: aqua; }
377 span.black { color: black; }
378 span.blue { color: blue; }
379 span.fuchsia { color: fuchsia; }
380 span.gray { color: gray; }
381 span.green { color: green; }
382 span.lime { color: lime; }
383 span.maroon { color: maroon; }
384 span.navy { color: navy; }
385 span.olive { color: olive; }
386 span.purple { color: purple; }
387 span.red { color: red; }
388 span.silver { color: silver; }
389 span.teal { color: teal; }
390 span.white { color: white; }
391 span.yellow { color: yellow; }
393 span.aqua-background { background: aqua; }
394 span.black-background { background: black; }
395 span.blue-background { background: blue; }
396 span.fuchsia-background { background: fuchsia; }
397 span.gray-background { background: gray; }
398 span.green-background { background: green; }
399 span.lime-background { background: lime; }
400 span.maroon-background { background: maroon; }
401 span.navy-background { background: navy; }
402 span.olive-background { background: olive; }
403 span.purple-background { background: purple; }
404 span.red-background { background: red; }
405 span.silver-background { background: silver; }
406 span.teal-background { background: teal; }
407 span.white-background { background: white; }
408 span.yellow-background { background: yellow; }
410 span.big { font-size: 2em; }
411 span.small { font-size: 0.6em; }
413 span.underline { text-decoration: underline; }
414 span.overline { text-decoration: overline; }
415 span.line-through { text-decoration: line-through; }
417 div.unbreakable { page-break-inside: avoid; }
421 * xhtml11 specific
423 * */
425 div.tableblock {
426 margin-top: 1.0em;
427 margin-bottom: 1.5em;
429 div.tableblock > table {
430 border: 3px solid #527bbd;
432 thead, p.table.header {
433 font-weight: bold;
434 color: #527bbd;
436 p.table {
437 margin-top: 0;
439 /* Because the table frame attribute is overridden by CSS in most browsers. */
440 div.tableblock > table[frame="void"] {
441 border-style: none;
443 div.tableblock > table[frame="hsides"] {
444 border-left-style: none;
445 border-right-style: none;
447 div.tableblock > table[frame="vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
454 * html5 specific
456 * */
458 table.tableblock {
459 margin-top: 1.0em;
460 margin-bottom: 1.5em;
462 thead, p.tableblock.header {
463 font-weight: bold;
464 color: #527bbd;
466 p.tableblock {
467 margin-top: 0;
469 table.tableblock {
470 border-width: 3px;
471 border-spacing: 0px;
472 border-style: solid;
473 border-color: #527bbd;
474 border-collapse: collapse;
476 th.tableblock, td.tableblock {
477 border-width: 1px;
478 padding: 4px;
479 border-style: solid;
480 border-color: #527bbd;
483 table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
487 table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
491 table.tableblock.frame-none {
492 border-style: hidden;
495 th.tableblock.halign-left, td.tableblock.halign-left {
496 text-align: left;
498 th.tableblock.halign-center, td.tableblock.halign-center {
499 text-align: center;
501 th.tableblock.halign-right, td.tableblock.halign-right {
502 text-align: right;
505 th.tableblock.valign-top, td.tableblock.valign-top {
506 vertical-align: top;
508 th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
511 th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
517 * manpage specific
519 * */
521 body.manpage h1 {
522 padding-top: 0.5em;
523 padding-bottom: 0.5em;
524 border-top: 2px solid silver;
525 border-bottom: 2px solid silver;
527 body.manpage h2 {
528 border-style: none;
530 body.manpage div.sectionbody {
531 margin-left: 3em;
534 @media print {
535 body.manpage div#toc { display: none; }
539 </style>
540 <script type="text/javascript">
541 /*<![CDATA[*/
542 var asciidoc = { // Namespace.
544 /////////////////////////////////////////////////////////////////////
545 // Table Of Contents generator
546 /////////////////////////////////////////////////////////////////////
548 /* Author: Mihai Bazon, September 2002
549 * http://students.infoiasi.ro/~mishoo
551 * Table Of Content generator
552 * Version: 0.4
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.
558 /* modified by Troy D. Hanson, September 2006. License: GPL */
559 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
561 // toclevels = 1..4.
562 toc: function (toclevels) {
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);
572 return text;
575 function TocEntry(el, text, toclevel) {
576 this.element = el;
577 this.text = text;
578 this.toclevel = toclevel;
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);
594 iterate(i);
598 iterate(el);
599 return result;
602 var toc = document.getElementById("toc");
603 if (!toc) {
604 return;
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);
617 for (i = 0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
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);
635 if (entries.length == 0)
636 toc.parentNode.removeChild(toc);
640 /////////////////////////////////////////////////////////////////////
641 // Footnotes generator
642 /////////////////////////////////////////////////////////////////////
644 /* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
648 footnotes: 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;
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);
661 for (i = 0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
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);
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;
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>]";
708 install: function(toclevels) {
709 var timerId;
711 function reinstall() {
712 asciidoc.footnotes();
713 if (toclevels) {
714 asciidoc.toc(toclevels);
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
720 reinstall();
723 timerId = setInterval(reinstall, 500);
724 if (document.addEventListener)
725 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
726 else
727 window.onload = reinstallAndRemoveTimer;
731 asciidoc.install();
732 /*]]>*/
733 </script>
734 </head>
735 <body class="manpage">
736 <div id="header">
737 <h1>
738 gitprotocol-v2(5) Manual Page
739 </h1>
740 <h2>NAME</h2>
741 <div class="sectionbody">
742 <p>gitprotocol-v2 -
743 Git Wire Protocol, Version 2
744 </p>
745 </div>
746 </div>
747 <div id="content">
748 <div class="sect1">
749 <h2 id="_synopsis">SYNOPSIS</h2>
750 <div class="sectionbody">
751 <div class="verseblock">
752 <pre class="content">&lt;over-the-wire-protocol&gt;</pre>
753 <div class="attribution">
754 </div></div>
755 </div>
756 </div>
757 <div class="sect1">
758 <h2 id="_description">DESCRIPTION</h2>
759 <div class="sectionbody">
760 <div class="paragraph"><p>This document presents a specification for a version 2 of Git&#8217;s wire
761 protocol. Protocol v2 will improve upon v1 in the following ways:</p></div>
762 <div class="ulist"><ul>
763 <li>
765 Instead of multiple service names, multiple commands will be
766 supported by a single service
767 </p>
768 </li>
769 <li>
771 Easily extendable as capabilities are moved into their own section
772 of the protocol, no longer being hidden behind a NUL byte and
773 limited by the size of a pkt-line
774 </p>
775 </li>
776 <li>
778 Separate out other information hidden behind NUL bytes (e.g. agent
779 string as a capability and symrefs can be requested using <em>ls-refs</em>)
780 </p>
781 </li>
782 <li>
784 Reference advertisement will be omitted unless explicitly requested
785 </p>
786 </li>
787 <li>
789 ls-refs command to explicitly request some refs
790 </p>
791 </li>
792 <li>
794 Designed with http and stateless-rpc in mind. With clear flush
795 semantics the http remote helper can simply act as a proxy
796 </p>
797 </li>
798 </ul></div>
799 <div class="paragraph"><p>In protocol v2 communication is command oriented. When first contacting a
800 server a list of capabilities will advertised. Some of these capabilities
801 will be commands which a client can request be executed. Once a command
802 has completed, a client can reuse the connection and request that other
803 commands be executed.</p></div>
804 </div>
805 </div>
806 <div class="sect1">
807 <h2 id="_packet_line_framing">Packet-Line Framing</h2>
808 <div class="sectionbody">
809 <div class="paragraph"><p>All communication is done using packet-line framing, just as in v1. See
810 <a href="gitprotocol-pack.html">gitprotocol-pack(5)</a> and <a href="gitprotocol-common.html">gitprotocol-common(5)</a> for more information.</p></div>
811 <div class="paragraph"><p>In protocol v2 these special packets will have the following semantics:</p></div>
812 <div class="ulist"><ul>
813 <li>
815 <em>0000</em> Flush Packet (flush-pkt) - indicates the end of a message
816 </p>
817 </li>
818 <li>
820 <em>0001</em> Delimiter Packet (delim-pkt) - separates sections of a message
821 </p>
822 </li>
823 <li>
825 <em>0002</em> Response End Packet (response-end-pkt) - indicates the end of a
826 response for stateless connections
827 </p>
828 </li>
829 </ul></div>
830 </div>
831 </div>
832 <div class="sect1">
833 <h2 id="_initial_client_request">Initial Client Request</h2>
834 <div class="sectionbody">
835 <div class="paragraph"><p>In general a client can request to speak protocol v2 by sending
836 <code>version=2</code> through the respective side-channel for the transport being
837 used which inevitably sets <code>GIT_PROTOCOL</code>. More information can be
838 found in <a href="gitprotocol-pack.html">gitprotocol-pack(5)</a> and <a href="gitprotocol-http.html">gitprotocol-http(5)</a>, as well as the
839 <code>GIT_PROTOCOL</code> definition in <code>git.txt</code>. In all cases the
840 response from the server is the capability advertisement.</p></div>
841 <div class="sect2">
842 <h3 id="_git_transport">Git Transport</h3>
843 <div class="paragraph"><p>When using the git:// transport, you can request to use protocol v2 by
844 sending "version=2" as an extra parameter:</p></div>
845 <div class="literalblock">
846 <div class="content">
847 <pre><code>003egit-upload-pack /project.git\0host=myserver.com\0\0version=2\0</code></pre>
848 </div></div>
849 </div>
850 <div class="sect2">
851 <h3 id="_ssh_and_file_transport">SSH and File Transport</h3>
852 <div class="paragraph"><p>When using either the ssh:// or file:// transport, the GIT_PROTOCOL
853 environment variable must be set explicitly to include "version=2".
854 The server may need to be configured to allow this environment variable
855 to pass.</p></div>
856 </div>
857 <div class="sect2">
858 <h3 id="_http_transport">HTTP Transport</h3>
859 <div class="paragraph"><p>When using the http:// or https:// transport a client makes a "smart"
860 info/refs request as described in <a href="gitprotocol-http.html">gitprotocol-http(5)</a> and requests that
861 v2 be used by supplying "version=2" in the <code>Git-Protocol</code> header.</p></div>
862 <div class="literalblock">
863 <div class="content">
864 <pre><code>C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
865 C: Git-Protocol: version=2</code></pre>
866 </div></div>
867 <div class="paragraph"><p>A v2 server would reply:</p></div>
868 <div class="literalblock">
869 <div class="content">
870 <pre><code>S: 200 OK
871 S: &lt;Some headers&gt;
872 S: ...
874 S: 000eversion 2\n
875 S: &lt;capability-advertisement&gt;</code></pre>
876 </div></div>
877 <div class="paragraph"><p>Subsequent requests are then made directly to the service
878 <code>$GIT_URL/git-upload-pack</code>. (This works the same for git-receive-pack).</p></div>
879 <div class="paragraph"><p>Uses the <code>--http-backend-info-refs</code> option to
880 <a href="git-upload-pack.html">git-upload-pack(1)</a>.</p></div>
881 <div class="paragraph"><p>The server may need to be configured to pass this header&#8217;s contents via
882 the <code>GIT_PROTOCOL</code> variable. See the discussion in <code>git-http-backend.txt</code>.</p></div>
883 </div>
884 </div>
885 </div>
886 <div class="sect1">
887 <h2 id="_capability_advertisement">Capability Advertisement</h2>
888 <div class="sectionbody">
889 <div class="paragraph"><p>A server which decides to communicate (based on a request from a client)
890 using protocol version 2, notifies the client by sending a version string
891 in its initial response followed by an advertisement of its capabilities.
892 Each capability is a key with an optional value. Clients must ignore all
893 unknown keys. Semantics of unknown values are left to the definition of
894 each key. Some capabilities will describe commands which can be requested
895 to be executed by the client.</p></div>
896 <div class="literalblock">
897 <div class="content">
898 <pre><code>capability-advertisement = protocol-version
899 capability-list
900 flush-pkt</code></pre>
901 </div></div>
902 <div class="literalblock">
903 <div class="content">
904 <pre><code>protocol-version = PKT-LINE("version 2" LF)
905 capability-list = *capability
906 capability = PKT-LINE(key[=value] LF)</code></pre>
907 </div></div>
908 <div class="literalblock">
909 <div class="content">
910 <pre><code>key = 1*(ALPHA | DIGIT | "-_")
911 value = 1*(ALPHA | DIGIT | " -_.,?\/{}[]()&lt;&gt;!@#$%^&amp;*+=:;")</code></pre>
912 </div></div>
913 </div>
914 </div>
915 <div class="sect1">
916 <h2 id="_command_request">Command Request</h2>
917 <div class="sectionbody">
918 <div class="paragraph"><p>After receiving the capability advertisement, a client can then issue a
919 request to select the command it wants with any particular capabilities
920 or arguments. There is then an optional section where the client can
921 provide any command specific parameters or queries. Only a single
922 command can be requested at a time.</p></div>
923 <div class="literalblock">
924 <div class="content">
925 <pre><code>request = empty-request | command-request
926 empty-request = flush-pkt
927 command-request = command
928 capability-list
929 delim-pkt
930 command-args
931 flush-pkt
932 command = PKT-LINE("command=" key LF)
933 command-args = *command-specific-arg</code></pre>
934 </div></div>
935 <div class="literalblock">
936 <div class="content">
937 <pre><code>command-specific-args are packet line framed arguments defined by
938 each individual command.</code></pre>
939 </div></div>
940 <div class="paragraph"><p>The server will then check to ensure that the client&#8217;s request is
941 comprised of a valid command as well as valid capabilities which were
942 advertised. If the request is valid the server will then execute the
943 command. A server MUST wait till it has received the client&#8217;s entire
944 request before issuing a response. The format of the response is
945 determined by the command being executed, but in all cases a flush-pkt
946 indicates the end of the response.</p></div>
947 <div class="paragraph"><p>When a command has finished, and the client has received the entire
948 response from the server, a client can either request that another
949 command be executed or can terminate the connection. A client may
950 optionally send an empty request consisting of just a flush-pkt to
951 indicate that no more requests will be made.</p></div>
952 </div>
953 </div>
954 <div class="sect1">
955 <h2 id="_capabilities">Capabilities</h2>
956 <div class="sectionbody">
957 <div class="paragraph"><p>There are two different types of capabilities: normal capabilities,
958 which can be used to convey information or alter the behavior of a
959 request, and commands, which are the core actions that a client wants to
960 perform (fetch, push, etc).</p></div>
961 <div class="paragraph"><p>Protocol version 2 is stateless by default. This means that all commands
962 must only last a single round and be stateless from the perspective of the
963 server side, unless the client has requested a capability indicating that
964 state should be maintained by the server. Clients MUST NOT require state
965 management on the server side in order to function correctly. This
966 permits simple round-robin load-balancing on the server side, without
967 needing to worry about state management.</p></div>
968 <div class="sect2">
969 <h3 id="_agent">agent</h3>
970 <div class="paragraph"><p>The server can advertise the <code>agent</code> capability with a value <code>X</code> (in the
971 form <code>agent=X</code>) to notify the client that the server is running version
972 <code>X</code>. The client may optionally send its own agent string by including
973 the <code>agent</code> capability with a value <code>Y</code> (in the form <code>agent=Y</code>) in its
974 request to the server (but it MUST NOT do so if the server did not
975 advertise the agent capability). The <code>X</code> and <code>Y</code> strings may contain any
976 printable ASCII characters except space (i.e., the byte range 32 &lt; x &lt;
977 127), and are typically of the form "package/version" (e.g.,
978 "git/1.8.3.1"). The agent strings are purely informative for statistics
979 and debugging purposes, and MUST NOT be used to programmatically assume
980 the presence or absence of particular features.</p></div>
981 </div>
982 <div class="sect2">
983 <h3 id="_ls_refs">ls-refs</h3>
984 <div class="paragraph"><p><code>ls-refs</code> is the command used to request a reference advertisement in v2.
985 Unlike the current reference advertisement, ls-refs takes in arguments
986 which can be used to limit the refs sent from the server.</p></div>
987 <div class="paragraph"><p>Additional features not supported in the base command will be advertised
988 as the value of the command in the capability advertisement in the form
989 of a space separated list of features: "&lt;command&gt;=&lt;feature 1&gt; &lt;feature 2&gt;"</p></div>
990 <div class="paragraph"><p>ls-refs takes in the following arguments:</p></div>
991 <div class="literalblock">
992 <div class="content">
993 <pre><code>symrefs
994 In addition to the object pointed by it, show the underlying ref
995 pointed by it when showing a symbolic ref.
996 peel
997 Show peeled tags.
998 ref-prefix &lt;prefix&gt;
999 When specified, only references having a prefix matching one of
1000 the provided prefixes are displayed. Multiple instances may be
1001 given, in which case references matching any prefix will be
1002 shown. Note that this is purely for optimization; a server MAY
1003 show refs not matching the prefix if it chooses, and clients
1004 should filter the result themselves.</code></pre>
1005 </div></div>
1006 <div class="paragraph"><p>If the <em>unborn</em> feature is advertised the following argument can be
1007 included in the client&#8217;s request.</p></div>
1008 <div class="literalblock">
1009 <div class="content">
1010 <pre><code>unborn
1011 The server will send information about HEAD even if it is a symref
1012 pointing to an unborn branch in the form "unborn HEAD
1013 symref-target:&lt;target&gt;".</code></pre>
1014 </div></div>
1015 <div class="paragraph"><p>The output of ls-refs is as follows:</p></div>
1016 <div class="literalblock">
1017 <div class="content">
1018 <pre><code>output = *ref
1019 flush-pkt
1020 obj-id-or-unborn = (obj-id | "unborn")
1021 ref = PKT-LINE(obj-id-or-unborn SP refname *(SP ref-attribute) LF)
1022 ref-attribute = (symref | peeled)
1023 symref = "symref-target:" symref-target
1024 peeled = "peeled:" obj-id</code></pre>
1025 </div></div>
1026 </div>
1027 <div class="sect2">
1028 <h3 id="_fetch">fetch</h3>
1029 <div class="paragraph"><p><code>fetch</code> is the command used to fetch a packfile in v2. It can be looked
1030 at as a modified version of the v1 fetch where the ref-advertisement is
1031 stripped out (since the <code>ls-refs</code> command fills that role) and the
1032 message format is tweaked to eliminate redundancies and permit easy
1033 addition of future extensions.</p></div>
1034 <div class="paragraph"><p>Additional features not supported in the base command will be advertised
1035 as the value of the command in the capability advertisement in the form
1036 of a space separated list of features: "&lt;command&gt;=&lt;feature 1&gt; &lt;feature 2&gt;"</p></div>
1037 <div class="paragraph"><p>A <code>fetch</code> request can take the following arguments:</p></div>
1038 <div class="literalblock">
1039 <div class="content">
1040 <pre><code>want &lt;oid&gt;
1041 Indicates to the server an object which the client wants to
1042 retrieve. Wants can be anything and are not limited to
1043 advertised objects.</code></pre>
1044 </div></div>
1045 <div class="literalblock">
1046 <div class="content">
1047 <pre><code>have &lt;oid&gt;
1048 Indicates to the server an object which the client has locally.
1049 This allows the server to make a packfile which only contains
1050 the objects that the client needs. Multiple 'have' lines can be
1051 supplied.</code></pre>
1052 </div></div>
1053 <div class="literalblock">
1054 <div class="content">
1055 <pre><code>done
1056 Indicates to the server that negotiation should terminate (or
1057 not even begin if performing a clone) and that the server should
1058 use the information supplied in the request to construct the
1059 packfile.</code></pre>
1060 </div></div>
1061 <div class="literalblock">
1062 <div class="content">
1063 <pre><code>thin-pack
1064 Request that a thin pack be sent, which is a pack with deltas
1065 which reference base objects not contained within the pack (but
1066 are known to exist at the receiving end). This can reduce the
1067 network traffic significantly, but it requires the receiving end
1068 to know how to "thicken" these packs by adding the missing bases
1069 to the pack.</code></pre>
1070 </div></div>
1071 <div class="literalblock">
1072 <div class="content">
1073 <pre><code>no-progress
1074 Request that progress information that would normally be sent on
1075 side-band channel 2, during the packfile transfer, should not be
1076 sent. However, the side-band channel 3 is still used for error
1077 responses.</code></pre>
1078 </div></div>
1079 <div class="literalblock">
1080 <div class="content">
1081 <pre><code>include-tag
1082 Request that annotated tags should be sent if the objects they
1083 point to are being sent.</code></pre>
1084 </div></div>
1085 <div class="literalblock">
1086 <div class="content">
1087 <pre><code>ofs-delta
1088 Indicate that the client understands PACKv2 with delta referring
1089 to its base by position in pack rather than by an oid. That is,
1090 they can read OBJ_OFS_DELTA (aka type 6) in a packfile.</code></pre>
1091 </div></div>
1092 <div class="paragraph"><p>If the <em>shallow</em> feature is advertised the following arguments can be
1093 included in the clients request as well as the potential addition of the
1094 <em>shallow-info</em> section in the server&#8217;s response as explained below.</p></div>
1095 <div class="literalblock">
1096 <div class="content">
1097 <pre><code>shallow &lt;oid&gt;
1098 A client must notify the server of all commits for which it only
1099 has shallow copies (meaning that it doesn't have the parents of
1100 a commit) by supplying a 'shallow &lt;oid&gt;' line for each such
1101 object so that the server is aware of the limitations of the
1102 client's history. This is so that the server is aware that the
1103 client may not have all objects reachable from such commits.</code></pre>
1104 </div></div>
1105 <div class="literalblock">
1106 <div class="content">
1107 <pre><code>deepen &lt;depth&gt;
1108 Requests that the fetch/clone should be shallow having a commit
1109 depth of &lt;depth&gt; relative to the remote side.</code></pre>
1110 </div></div>
1111 <div class="literalblock">
1112 <div class="content">
1113 <pre><code>deepen-relative
1114 Requests that the semantics of the "deepen" command be changed
1115 to indicate that the depth requested is relative to the client's
1116 current shallow boundary, instead of relative to the requested
1117 commits.</code></pre>
1118 </div></div>
1119 <div class="literalblock">
1120 <div class="content">
1121 <pre><code>deepen-since &lt;timestamp&gt;
1122 Requests that the shallow clone/fetch should be cut at a
1123 specific time, instead of depth. Internally it's equivalent to
1124 doing "git rev-list --max-age=&lt;timestamp&gt;". Cannot be used with
1125 "deepen".</code></pre>
1126 </div></div>
1127 <div class="literalblock">
1128 <div class="content">
1129 <pre><code>deepen-not &lt;rev&gt;
1130 Requests that the shallow clone/fetch should be cut at a
1131 specific revision specified by '&lt;rev&gt;', instead of a depth.
1132 Internally it's equivalent of doing "git rev-list --not &lt;rev&gt;".
1133 Cannot be used with "deepen", but can be used with
1134 "deepen-since".</code></pre>
1135 </div></div>
1136 <div class="paragraph"><p>If the <em>filter</em> feature is advertised, the following argument can be
1137 included in the client&#8217;s request:</p></div>
1138 <div class="literalblock">
1139 <div class="content">
1140 <pre><code>filter &lt;filter-spec&gt;
1141 Request that various objects from the packfile be omitted
1142 using one of several filtering techniques. These are intended
1143 for use with partial clone and partial fetch operations. See
1144 `rev-list` for possible "filter-spec" values. When communicating
1145 with other processes, senders SHOULD translate scaled integers
1146 (e.g. "1k") into a fully-expanded form (e.g. "1024") to aid
1147 interoperability with older receivers that may not understand
1148 newly-invented scaling suffixes. However, receivers SHOULD
1149 accept the following suffixes: 'k', 'm', and 'g' for 1024,
1150 1048576, and 1073741824, respectively.</code></pre>
1151 </div></div>
1152 <div class="paragraph"><p>If the <em>ref-in-want</em> feature is advertised, the following argument can
1153 be included in the client&#8217;s request as well as the potential addition of
1154 the <em>wanted-refs</em> section in the server&#8217;s response as explained below.</p></div>
1155 <div class="literalblock">
1156 <div class="content">
1157 <pre><code>want-ref &lt;ref&gt;
1158 Indicates to the server that the client wants to retrieve a
1159 particular ref, where &lt;ref&gt; is the full name of a ref on the
1160 server.</code></pre>
1161 </div></div>
1162 <div class="paragraph"><p>If the <em>sideband-all</em> feature is advertised, the following argument can be
1163 included in the client&#8217;s request:</p></div>
1164 <div class="literalblock">
1165 <div class="content">
1166 <pre><code>sideband-all
1167 Instruct the server to send the whole response multiplexed, not just
1168 the packfile section. All non-flush and non-delim PKT-LINE in the
1169 response (not only in the packfile section) will then start with a byte
1170 indicating its sideband (1, 2, or 3), and the server may send "0005\2"
1171 (a PKT-LINE of sideband 2 with no payload) as a keepalive packet.</code></pre>
1172 </div></div>
1173 <div class="paragraph"><p>If the <em>packfile-uris</em> feature is advertised, the following argument
1174 can be included in the client&#8217;s request as well as the potential
1175 addition of the <em>packfile-uris</em> section in the server&#8217;s response as
1176 explained below.</p></div>
1177 <div class="literalblock">
1178 <div class="content">
1179 <pre><code>packfile-uris &lt;comma-separated list of protocols&gt;
1180 Indicates to the server that the client is willing to receive
1181 URIs of any of the given protocols in place of objects in the
1182 sent packfile. Before performing the connectivity check, the
1183 client should download from all given URIs. Currently, the
1184 protocols supported are "http" and "https".</code></pre>
1185 </div></div>
1186 <div class="paragraph"><p>If the <em>wait-for-done</em> feature is advertised, the following argument
1187 can be included in the client&#8217;s request.</p></div>
1188 <div class="literalblock">
1189 <div class="content">
1190 <pre><code>wait-for-done
1191 Indicates to the server that it should never send "ready", but
1192 should wait for the client to say "done" before sending the
1193 packfile.</code></pre>
1194 </div></div>
1195 <div class="paragraph"><p>The response of <code>fetch</code> is broken into a number of sections separated by
1196 delimiter packets (0001), with each section beginning with its section
1197 header. Most sections are sent only when the packfile is sent.</p></div>
1198 <div class="literalblock">
1199 <div class="content">
1200 <pre><code>output = acknowledgements flush-pkt |
1201 [acknowledgments delim-pkt] [shallow-info delim-pkt]
1202 [wanted-refs delim-pkt] [packfile-uris delim-pkt]
1203 packfile flush-pkt</code></pre>
1204 </div></div>
1205 <div class="literalblock">
1206 <div class="content">
1207 <pre><code>acknowledgments = PKT-LINE("acknowledgments" LF)
1208 (nak | *ack)
1209 (ready)
1210 ready = PKT-LINE("ready" LF)
1211 nak = PKT-LINE("NAK" LF)
1212 ack = PKT-LINE("ACK" SP obj-id LF)</code></pre>
1213 </div></div>
1214 <div class="literalblock">
1215 <div class="content">
1216 <pre><code>shallow-info = PKT-LINE("shallow-info" LF)
1217 *PKT-LINE((shallow | unshallow) LF)
1218 shallow = "shallow" SP obj-id
1219 unshallow = "unshallow" SP obj-id</code></pre>
1220 </div></div>
1221 <div class="literalblock">
1222 <div class="content">
1223 <pre><code>wanted-refs = PKT-LINE("wanted-refs" LF)
1224 *PKT-LINE(wanted-ref LF)
1225 wanted-ref = obj-id SP refname</code></pre>
1226 </div></div>
1227 <div class="literalblock">
1228 <div class="content">
1229 <pre><code>packfile-uris = PKT-LINE("packfile-uris" LF) *packfile-uri
1230 packfile-uri = PKT-LINE(40*(HEXDIGIT) SP *%x20-ff LF)</code></pre>
1231 </div></div>
1232 <div class="literalblock">
1233 <div class="content">
1234 <pre><code>packfile = PKT-LINE("packfile" LF)
1235 *PKT-LINE(%x01-03 *%x00-ff)</code></pre>
1236 </div></div>
1237 <div class="literalblock">
1238 <div class="content">
1239 <pre><code>acknowledgments section
1240 * If the client determines that it is finished with negotiations by
1241 sending a "done" line (thus requiring the server to send a packfile),
1242 the acknowledgments sections MUST be omitted from the server's
1243 response.</code></pre>
1244 </div></div>
1245 <div class="ulist"><ul>
1246 <li>
1248 Always begins with the section header "acknowledgments"
1249 </p>
1250 </li>
1251 <li>
1253 The server will respond with "NAK" if none of the object ids sent
1254 as have lines were common.
1255 </p>
1256 </li>
1257 <li>
1259 The server will respond with "ACK obj-id" for all of the
1260 object ids sent as have lines which are common.
1261 </p>
1262 </li>
1263 <li>
1265 A response cannot have both "ACK" lines as well as a "NAK"
1266 line.
1267 </p>
1268 </li>
1269 <li>
1271 The server will respond with a "ready" line indicating that
1272 the server has found an acceptable common base and is ready to
1273 make and send a packfile (which will be found in the packfile
1274 section of the same response)
1275 </p>
1276 </li>
1277 <li>
1279 If the server has found a suitable cut point and has decided
1280 to send a "ready" line, then the server can decide to (as an
1281 optimization) omit any "ACK" lines it would have sent during
1282 its response. This is because the server will have already
1283 determined the objects it plans to send to the client and no
1284 further negotiation is needed.
1285 </p>
1286 <div class="literalblock">
1287 <div class="content">
1288 <pre><code>shallow-info section
1289 * If the client has requested a shallow fetch/clone, a shallow
1290 client requests a fetch or the server is shallow then the
1291 server's response may include a shallow-info section. The
1292 shallow-info section will be included if (due to one of the
1293 above conditions) the server needs to inform the client of any
1294 shallow boundaries or adjustments to the clients already
1295 existing shallow boundaries.</code></pre>
1296 </div></div>
1297 </li>
1298 <li>
1300 Always begins with the section header "shallow-info"
1301 </p>
1302 </li>
1303 <li>
1305 If a positive depth is requested, the server will compute the
1306 set of commits which are no deeper than the desired depth.
1307 </p>
1308 </li>
1309 <li>
1311 The server sends a "shallow obj-id" line for each commit whose
1312 parents will not be sent in the following packfile.
1313 </p>
1314 </li>
1315 <li>
1317 The server sends an "unshallow obj-id" line for each commit
1318 which the client has indicated is shallow, but is no longer
1319 shallow as a result of the fetch (due to its parents being
1320 sent in the following packfile).
1321 </p>
1322 </li>
1323 <li>
1325 The server MUST NOT send any "unshallow" lines for anything
1326 which the client has not indicated was shallow as a part of
1327 its request.
1328 </p>
1329 <div class="literalblock">
1330 <div class="content">
1331 <pre><code>wanted-refs section
1332 * This section is only included if the client has requested a
1333 ref using a 'want-ref' line and if a packfile section is also
1334 included in the response.</code></pre>
1335 </div></div>
1336 </li>
1337 <li>
1339 Always begins with the section header "wanted-refs".
1340 </p>
1341 </li>
1342 <li>
1344 The server will send a ref listing ("&lt;oid&gt; &lt;refname&gt;") for
1345 each reference requested using <em>want-ref</em> lines.
1346 </p>
1347 </li>
1348 <li>
1350 The server MUST NOT send any refs which were not requested
1351 using <em>want-ref</em> lines.
1352 </p>
1353 <div class="literalblock">
1354 <div class="content">
1355 <pre><code>packfile-uris section
1356 * This section is only included if the client sent
1357 'packfile-uris' and the server has at least one such URI to
1358 send.</code></pre>
1359 </div></div>
1360 </li>
1361 <li>
1363 Always begins with the section header "packfile-uris".
1364 </p>
1365 </li>
1366 <li>
1368 For each URI the server sends, it sends a hash of the pack&#8217;s
1369 contents (as output by git index-pack) followed by the URI.
1370 </p>
1371 </li>
1372 <li>
1374 The hashes are 40 hex characters long. When Git upgrades to a new
1375 hash algorithm, this might need to be updated. (It should match
1376 whatever index-pack outputs after "pack\t" or "keep\t".
1377 </p>
1378 <div class="literalblock">
1379 <div class="content">
1380 <pre><code>packfile section
1381 * This section is only included if the client has sent 'want'
1382 lines in its request and either requested that no more
1383 negotiation be done by sending 'done' or if the server has
1384 decided it has found a sufficient cut point to produce a
1385 packfile.</code></pre>
1386 </div></div>
1387 </li>
1388 <li>
1390 Always begins with the section header "packfile"
1391 </p>
1392 </li>
1393 <li>
1395 The transmission of the packfile begins immediately after the
1396 section header
1397 </p>
1398 </li>
1399 <li>
1401 The data transfer of the packfile is always multiplexed, using
1402 the same semantics of the <em>side-band-64k</em> capability from
1403 protocol version 1. This means that each packet, during the
1404 packfile data stream, is made up of a leading 4-byte pkt-line
1405 length (typical of the pkt-line format), followed by a 1-byte
1406 stream code, followed by the actual data.
1407 </p>
1408 <div class="literalblock">
1409 <div class="content">
1410 <pre><code>The stream code can be one of:
1411 1 - pack data
1412 2 - progress messages
1413 3 - fatal error message just before stream aborts</code></pre>
1414 </div></div>
1415 </li>
1416 </ul></div>
1417 </div>
1418 <div class="sect2">
1419 <h3 id="_server_option">server-option</h3>
1420 <div class="paragraph"><p>If advertised, indicates that any number of server specific options can be
1421 included in a request. This is done by sending each option as a
1422 "server-option=&lt;option&gt;" capability line in the capability-list section of
1423 a request.</p></div>
1424 <div class="paragraph"><p>The provided options must not contain a NUL or LF character.</p></div>
1425 </div>
1426 <div class="sect2">
1427 <h3 id="_object_format"> object-format</h3>
1428 <div class="paragraph"><p>The server can advertise the <code>object-format</code> capability with a value <code>X</code> (in the
1429 form <code>object-format=X</code>) to notify the client that the server is able to deal
1430 with objects using hash algorithm X. If not specified, the server is assumed to
1431 only handle SHA-1. If the client would like to use a hash algorithm other than
1432 SHA-1, it should specify its object-format string.</p></div>
1433 </div>
1434 <div class="sect2">
1435 <h3 id="_session_id_lt_session_id_gt">session-id=&lt;session id&gt;</h3>
1436 <div class="paragraph"><p>The server may advertise a session ID that can be used to identify this process
1437 across multiple requests. The client may advertise its own session ID back to
1438 the server as well.</p></div>
1439 <div class="paragraph"><p>Session IDs should be unique to a given process. They must fit within a
1440 packet-line, and must not contain non-printable or whitespace characters. The
1441 current implementation uses trace2 session IDs (see
1442 <a href="technical/api-trace2.html">api-trace2</a> for details), but this may change
1443 and users of the session ID should not rely on this fact.</p></div>
1444 </div>
1445 <div class="sect2">
1446 <h3 id="_object_info">object-info</h3>
1447 <div class="paragraph"><p><code>object-info</code> is the command to retrieve information about one or more objects.
1448 Its main purpose is to allow a client to make decisions based on this
1449 information without having to fully fetch objects. Object size is the only
1450 information that is currently supported.</p></div>
1451 <div class="paragraph"><p>An <code>object-info</code> request takes the following arguments:</p></div>
1452 <div class="literalblock">
1453 <div class="content">
1454 <pre><code>size
1455 Requests size information to be returned for each listed object id.</code></pre>
1456 </div></div>
1457 <div class="literalblock">
1458 <div class="content">
1459 <pre><code>oid &lt;oid&gt;
1460 Indicates to the server an object which the client wants to obtain
1461 information for.</code></pre>
1462 </div></div>
1463 <div class="paragraph"><p>The response of <code>object-info</code> is a list of the requested object ids
1464 and associated requested information, each separated by a single space.</p></div>
1465 <div class="literalblock">
1466 <div class="content">
1467 <pre><code>output = info flush-pkt</code></pre>
1468 </div></div>
1469 <div class="literalblock">
1470 <div class="content">
1471 <pre><code>info = PKT-LINE(attrs) LF)
1472 *PKT-LINE(obj-info LF)</code></pre>
1473 </div></div>
1474 <div class="literalblock">
1475 <div class="content">
1476 <pre><code>attrs = attr | attrs SP attrs</code></pre>
1477 </div></div>
1478 <div class="literalblock">
1479 <div class="content">
1480 <pre><code>attr = "size"</code></pre>
1481 </div></div>
1482 <div class="literalblock">
1483 <div class="content">
1484 <pre><code>obj-info = obj-id SP obj-size</code></pre>
1485 </div></div>
1486 </div>
1487 </div>
1488 </div>
1489 <div class="sect1">
1490 <h2 id="_git">GIT</h2>
1491 <div class="sectionbody">
1492 <div class="paragraph"><p>Part of the <a href="git.html">git(1)</a> suite</p></div>
1493 </div>
1494 </div>
1495 </div>
1496 <div id="footnotes"><hr /></div>
1497 <div id="footer">
1498 <div id="footer-text">
1499 Last updated
1500 2022-09-21 15:44:34 PDT
1501 </div>
1502 </div>
1503 </body>
1504 </html>