blob: 4b7719e05bb276f5f90fed8b0c69598103c2d8f9 [file] [log] [blame]
Junio C Hamanof2b74942012-11-20 21:06:261<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4<head>
Junio C Hamano9d971152012-12-19 00:43:115<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
Junio C Hamano61525f92014-01-17 22:46:496<meta name="generator" content="AsciiDoc 8.6.6" />
Junio C Hamano076ffcc2013-02-06 05:13:217<title>Git pack format</title>
Junio C Hamanof2b74942012-11-20 21:06:268<style type="text/css">
Junio C Hamano9d971152012-12-19 00:43:119/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
10
11/* Default font. */
12body {
13 font-family: Georgia,serif;
14}
15
16/* Title font. */
17h1, h2, h3, h4, h5, h6,
18div.title, caption.title,
19thead, p.table.header,
20#toctitle,
21#author, #revnumber, #revdate, #revremark,
22#footer {
23 font-family: Arial,Helvetica,sans-serif;
Junio C Hamanof2b74942012-11-20 21:06:2624}
25
26body {
27 margin: 1em 5% 1em 5%;
28}
29
30a {
31 color: blue;
32 text-decoration: underline;
33}
34a:visited {
35 color: fuchsia;
36}
37
38em {
39 font-style: italic;
40 color: navy;
41}
42
43strong {
44 font-weight: bold;
45 color: #083194;
46}
47
Junio C Hamanof2b74942012-11-20 21:06:2648h1, h2, h3, h4, h5, h6 {
49 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:2650 margin-top: 1.2em;
51 margin-bottom: 0.5em;
52 line-height: 1.3;
53}
54
55h1, h2, h3 {
56 border-bottom: 2px solid silver;
57}
58h2 {
59 padding-top: 0.5em;
60}
61h3 {
62 float: left;
63}
64h3 + * {
65 clear: left;
66}
Junio C Hamano9d971152012-12-19 00:43:1167h5 {
68 font-size: 1.0em;
69}
Junio C Hamanof2b74942012-11-20 21:06:2670
71div.sectionbody {
Junio C Hamanof2b74942012-11-20 21:06:2672 margin-left: 0;
73}
74
75hr {
76 border: 1px solid silver;
77}
78
79p {
80 margin-top: 0.5em;
81 margin-bottom: 0.5em;
82}
83
84ul, ol, li > p {
85 margin-top: 0;
86}
Junio C Hamano9d971152012-12-19 00:43:1187ul > li { color: #aaa; }
88ul > li > * { color: black; }
Junio C Hamanof2b74942012-11-20 21:06:2689
Junio C Hamano61525f92014-01-17 22:46:4990pre {
Junio C Hamanof2b74942012-11-20 21:06:2691 padding: 0;
92 margin: 0;
93}
94
Junio C Hamano9d971152012-12-19 00:43:1195#author {
Junio C Hamanof2b74942012-11-20 21:06:2696 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:2697 font-weight: bold;
98 font-size: 1.1em;
99}
Junio C Hamano9d971152012-12-19 00:43:11100#email {
Junio C Hamanof2b74942012-11-20 21:06:26101}
Junio C Hamano9d971152012-12-19 00:43:11102#revnumber, #revdate, #revremark {
Junio C Hamanof2b74942012-11-20 21:06:26103}
104
Junio C Hamano9d971152012-12-19 00:43:11105#footer {
Junio C Hamanof2b74942012-11-20 21:06:26106 font-size: small;
107 border-top: 2px solid silver;
108 padding-top: 0.5em;
109 margin-top: 4.0em;
110}
Junio C Hamano9d971152012-12-19 00:43:11111#footer-text {
Junio C Hamanof2b74942012-11-20 21:06:26112 float: left;
113 padding-bottom: 0.5em;
114}
Junio C Hamano9d971152012-12-19 00:43:11115#footer-badges {
Junio C Hamanof2b74942012-11-20 21:06:26116 float: right;
117 padding-bottom: 0.5em;
118}
119
Junio C Hamano9d971152012-12-19 00:43:11120#preamble {
Junio C Hamanof2b74942012-11-20 21:06:26121 margin-top: 1.5em;
122 margin-bottom: 1.5em;
123}
Junio C Hamano9d971152012-12-19 00:43:11124div.imageblock, div.exampleblock, div.verseblock,
Junio C Hamanof2b74942012-11-20 21:06:26125div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
126div.admonitionblock {
127 margin-top: 1.0em;
128 margin-bottom: 1.5em;
129}
130div.admonitionblock {
131 margin-top: 2.0em;
132 margin-bottom: 2.0em;
133 margin-right: 10%;
134 color: #606060;
135}
136
137div.content { /* Block element content. */
138 padding: 0;
139}
140
141/* Block element titles. */
142div.title, caption.title {
143 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:26144 font-weight: bold;
145 text-align: left;
146 margin-top: 1.0em;
147 margin-bottom: 0.5em;
148}
149div.title + * {
150 margin-top: 0;
151}
152
153td div.title:first-child {
154 margin-top: 0.0em;
155}
156div.content div.title:first-child {
157 margin-top: 0.0em;
158}
159div.content + div.title {
160 margin-top: 0.0em;
161}
162
163div.sidebarblock > div.content {
164 background: #ffffee;
Junio C Hamano9d971152012-12-19 00:43:11165 border: 1px solid #dddddd;
166 border-left: 4px solid #f0f0f0;
Junio C Hamanof2b74942012-11-20 21:06:26167 padding: 0.5em;
168}
169
170div.listingblock > div.content {
Junio C Hamano9d971152012-12-19 00:43:11171 border: 1px solid #dddddd;
172 border-left: 5px solid #f0f0f0;
173 background: #f8f8f8;
Junio C Hamanof2b74942012-11-20 21:06:26174 padding: 0.5em;
175}
176
177div.quoteblock, div.verseblock {
178 padding-left: 1.0em;
179 margin-left: 1.0em;
180 margin-right: 10%;
Junio C Hamano9d971152012-12-19 00:43:11181 border-left: 5px solid #f0f0f0;
182 color: #888;
Junio C Hamanof2b74942012-11-20 21:06:26183}
184
185div.quoteblock > div.attribution {
186 padding-top: 0.5em;
187 text-align: right;
188}
189
Junio C Hamano9d971152012-12-19 00:43:11190div.verseblock > pre.content {
191 font-family: inherit;
192 font-size: inherit;
Junio C Hamanof2b74942012-11-20 21:06:26193}
194div.verseblock > div.attribution {
195 padding-top: 0.75em;
196 text-align: left;
197}
198/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
199div.verseblock + div.attribution {
200 text-align: left;
201}
202
203div.admonitionblock .icon {
204 vertical-align: top;
205 font-size: 1.1em;
206 font-weight: bold;
207 text-decoration: underline;
208 color: #527bbd;
209 padding-right: 0.5em;
210}
211div.admonitionblock td.content {
212 padding-left: 0.5em;
213 border-left: 3px solid #dddddd;
214}
215
216div.exampleblock > div.content {
217 border-left: 3px solid #dddddd;
218 padding-left: 0.5em;
219}
220
221div.imageblock div.content { padding-left: 0; }
222span.image img { border-style: none; }
223a.image:visited { color: white; }
224
225dl {
226 margin-top: 0.8em;
227 margin-bottom: 0.8em;
228}
229dt {
230 margin-top: 0.5em;
231 margin-bottom: 0;
232 font-style: normal;
233 color: navy;
234}
235dd > *:first-child {
236 margin-top: 0.1em;
237}
238
239ul, ol {
240 list-style-position: outside;
241}
242ol.arabic {
243 list-style-type: decimal;
244}
245ol.loweralpha {
246 list-style-type: lower-alpha;
247}
248ol.upperalpha {
249 list-style-type: upper-alpha;
250}
251ol.lowerroman {
252 list-style-type: lower-roman;
253}
254ol.upperroman {
255 list-style-type: upper-roman;
256}
257
258div.compact ul, div.compact ol,
259div.compact p, div.compact p,
260div.compact div, div.compact div {
261 margin-top: 0.1em;
262 margin-bottom: 0.1em;
263}
264
Junio C Hamanof2b74942012-11-20 21:06:26265tfoot {
266 font-weight: bold;
267}
268td > div.verse {
269 white-space: pre;
270}
Junio C Hamanof2b74942012-11-20 21:06:26271
272div.hdlist {
273 margin-top: 0.8em;
274 margin-bottom: 0.8em;
275}
276div.hdlist tr {
277 padding-bottom: 15px;
278}
279dt.hdlist1.strong, td.hdlist1.strong {
280 font-weight: bold;
281}
282td.hdlist1 {
283 vertical-align: top;
284 font-style: normal;
285 padding-right: 0.8em;
286 color: navy;
287}
288td.hdlist2 {
289 vertical-align: top;
290}
291div.hdlist.compact tr {
292 margin: 0;
293 padding-bottom: 0;
294}
295
296.comment {
297 background: yellow;
298}
299
300.footnote, .footnoteref {
301 font-size: 0.8em;
302}
303
304span.footnote, span.footnoteref {
305 vertical-align: super;
306}
307
308#footnotes {
309 margin: 20px 0 20px 0;
310 padding: 7px 0 0 0;
311}
312
313#footnotes div.footnote {
314 margin: 0 0 5px 0;
315}
316
317#footnotes hr {
318 border: none;
319 border-top: 1px solid silver;
320 height: 1px;
321 text-align: left;
322 margin-left: 0;
323 width: 20%;
324 min-width: 100px;
325}
326
Junio C Hamano9d971152012-12-19 00:43:11327div.colist td {
328 padding-right: 0.5em;
329 padding-bottom: 0.3em;
330 vertical-align: top;
331}
332div.colist td img {
333 margin-top: 0.3em;
Junio C Hamanof2b74942012-11-20 21:06:26334}
335
Junio C Hamano9d971152012-12-19 00:43:11336@media print {
337 #footer-badges { display: none; }
338}
339
340#toc {
Junio C Hamanof2b74942012-11-20 21:06:26341 margin-bottom: 2.5em;
342}
343
Junio C Hamano9d971152012-12-19 00:43:11344#toctitle {
Junio C Hamanof2b74942012-11-20 21:06:26345 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:26346 font-size: 1.1em;
347 font-weight: bold;
348 margin-top: 1.0em;
349 margin-bottom: 0.1em;
350}
351
Junio C Hamano61525f92014-01-17 22:46:49352div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
Junio C Hamanof2b74942012-11-20 21:06:26353 margin-top: 0;
354 margin-bottom: 0;
355}
356div.toclevel2 {
357 margin-left: 2em;
358 font-size: 0.9em;
359}
360div.toclevel3 {
361 margin-left: 4em;
362 font-size: 0.9em;
363}
364div.toclevel4 {
365 margin-left: 6em;
366 font-size: 0.9em;
367}
Junio C Hamanof2b74942012-11-20 21:06:26368
Junio C Hamano9d971152012-12-19 00:43:11369span.aqua { color: aqua; }
370span.black { color: black; }
371span.blue { color: blue; }
372span.fuchsia { color: fuchsia; }
373span.gray { color: gray; }
374span.green { color: green; }
375span.lime { color: lime; }
376span.maroon { color: maroon; }
377span.navy { color: navy; }
378span.olive { color: olive; }
379span.purple { color: purple; }
380span.red { color: red; }
381span.silver { color: silver; }
382span.teal { color: teal; }
383span.white { color: white; }
384span.yellow { color: yellow; }
385
386span.aqua-background { background: aqua; }
387span.black-background { background: black; }
388span.blue-background { background: blue; }
389span.fuchsia-background { background: fuchsia; }
390span.gray-background { background: gray; }
391span.green-background { background: green; }
392span.lime-background { background: lime; }
393span.maroon-background { background: maroon; }
394span.navy-background { background: navy; }
395span.olive-background { background: olive; }
396span.purple-background { background: purple; }
397span.red-background { background: red; }
398span.silver-background { background: silver; }
399span.teal-background { background: teal; }
400span.white-background { background: white; }
401span.yellow-background { background: yellow; }
402
403span.big { font-size: 2em; }
404span.small { font-size: 0.6em; }
405
406span.underline { text-decoration: underline; }
407span.overline { text-decoration: overline; }
408span.line-through { text-decoration: line-through; }
409
Junio C Hamano9d971152012-12-19 00:43:11410
411/*
412 * xhtml11 specific
413 *
414 * */
415
Junio C Hamano61525f92014-01-17 22:46:49416tt {
417 font-family: monospace;
418 font-size: inherit;
419 color: navy;
420}
421
Junio C Hamano9d971152012-12-19 00:43:11422div.tableblock {
423 margin-top: 1.0em;
424 margin-bottom: 1.5em;
Junio C Hamanof2b74942012-11-20 21:06:26425}
Junio C Hamano9d971152012-12-19 00:43:11426div.tableblock > table {
427 border: 3px solid #527bbd;
428}
429thead, p.table.header {
Junio C Hamanof2b74942012-11-20 21:06:26430 font-weight: bold;
Junio C Hamano9d971152012-12-19 00:43:11431 color: #527bbd;
432}
433p.table {
434 margin-top: 0;
435}
436/* Because the table frame attribute is overriden by CSS in most browsers. */
437div.tableblock > table[frame="void"] {
438 border-style: none;
439}
440div.tableblock > table[frame="hsides"] {
441 border-left-style: none;
442 border-right-style: none;
443}
444div.tableblock > table[frame="vsides"] {
445 border-top-style: none;
446 border-bottom-style: none;
Junio C Hamanof2b74942012-11-20 21:06:26447}
448
Junio C Hamano9d971152012-12-19 00:43:11449
450/*
451 * html5 specific
452 *
453 * */
454
Junio C Hamano61525f92014-01-17 22:46:49455.monospaced {
456 font-family: monospace;
457 font-size: inherit;
458 color: navy;
459}
460
Junio C Hamano9d971152012-12-19 00:43:11461table.tableblock {
462 margin-top: 1.0em;
463 margin-bottom: 1.5em;
464}
465thead, p.tableblock.header {
466 font-weight: bold;
467 color: #527bbd;
468}
469p.tableblock {
470 margin-top: 0;
471}
472table.tableblock {
473 border-width: 3px;
474 border-spacing: 0px;
475 border-style: solid;
476 border-color: #527bbd;
477 border-collapse: collapse;
478}
479th.tableblock, td.tableblock {
480 border-width: 1px;
481 padding: 4px;
482 border-style: solid;
483 border-color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:26484}
485
Junio C Hamano9d971152012-12-19 00:43:11486table.tableblock.frame-topbot {
487 border-left-style: hidden;
488 border-right-style: hidden;
489}
490table.tableblock.frame-sides {
491 border-top-style: hidden;
492 border-bottom-style: hidden;
493}
494table.tableblock.frame-none {
495 border-style: hidden;
496}
497
498th.tableblock.halign-left, td.tableblock.halign-left {
499 text-align: left;
500}
501th.tableblock.halign-center, td.tableblock.halign-center {
502 text-align: center;
503}
504th.tableblock.halign-right, td.tableblock.halign-right {
Junio C Hamanof2b74942012-11-20 21:06:26505 text-align: right;
506}
507
Junio C Hamano9d971152012-12-19 00:43:11508th.tableblock.valign-top, td.tableblock.valign-top {
509 vertical-align: top;
Junio C Hamanof2b74942012-11-20 21:06:26510}
Junio C Hamano9d971152012-12-19 00:43:11511th.tableblock.valign-middle, td.tableblock.valign-middle {
512 vertical-align: middle;
513}
514th.tableblock.valign-bottom, td.tableblock.valign-bottom {
515 vertical-align: bottom;
Junio C Hamanof2b74942012-11-20 21:06:26516}
517
Junio C Hamano9d971152012-12-19 00:43:11518
519/*
520 * manpage specific
521 *
522 * */
523
524body.manpage h1 {
525 padding-top: 0.5em;
526 padding-bottom: 0.5em;
527 border-top: 2px solid silver;
528 border-bottom: 2px solid silver;
529}
530body.manpage h2 {
531 border-style: none;
532}
533body.manpage div.sectionbody {
534 margin-left: 3em;
Junio C Hamanof2b74942012-11-20 21:06:26535}
536
Junio C Hamano9d971152012-12-19 00:43:11537@media print {
538 body.manpage div#toc { display: none; }
539}
Junio C Hamanof2b74942012-11-20 21:06:26540</style>
541<script type="text/javascript">
542/*<![CDATA[*/
Junio C Hamanof2b74942012-11-20 21:06:26543var asciidoc = { // Namespace.
544
545/////////////////////////////////////////////////////////////////////
546// Table Of Contents generator
547/////////////////////////////////////////////////////////////////////
548
549/* Author: Mihai Bazon, September 2002
550 * http://students.infoiasi.ro/~mishoo
551 *
552 * Table Of Content generator
553 * Version: 0.4
554 *
555 * Feel free to use this script under the terms of the GNU General Public
556 * License, as long as you do not remove or alter this notice.
557 */
558
559 /* modified by Troy D. Hanson, September 2006. License: GPL */
560 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
561
562// toclevels = 1..4.
563toc: function (toclevels) {
564
565 function getText(el) {
566 var text = "";
567 for (var i = el.firstChild; i != null; i = i.nextSibling) {
568 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
569 text += i.data;
570 else if (i.firstChild != null)
571 text += getText(i);
572 }
573 return text;
574 }
575
576 function TocEntry(el, text, toclevel) {
577 this.element = el;
578 this.text = text;
579 this.toclevel = toclevel;
580 }
581
582 function tocEntries(el, toclevels) {
583 var result = new Array;
Junio C Hamano61525f92014-01-17 22:46:49584 var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
Junio C Hamanof2b74942012-11-20 21:06:26585 // Function that scans the DOM tree for header elements (the DOM2
586 // nodeIterator API would be a better technique but not supported by all
587 // browsers).
588 var iterate = function (el) {
589 for (var i = el.firstChild; i != null; i = i.nextSibling) {
590 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
591 var mo = re.exec(i.tagName);
592 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
593 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
594 }
595 iterate(i);
596 }
597 }
598 }
599 iterate(el);
600 return result;
601 }
602
603 var toc = document.getElementById("toc");
Junio C Hamano9d971152012-12-19 00:43:11604 if (!toc) {
605 return;
606 }
607
608 // Delete existing TOC entries in case we're reloading the TOC.
609 var tocEntriesToRemove = [];
610 var i;
611 for (i = 0; i < toc.childNodes.length; i++) {
612 var entry = toc.childNodes[i];
Junio C Hamano61525f92014-01-17 22:46:49613 if (entry.nodeName == 'div'
Junio C Hamano9d971152012-12-19 00:43:11614 && entry.getAttribute("class")
615 && entry.getAttribute("class").match(/^toclevel/))
616 tocEntriesToRemove.push(entry);
617 }
618 for (i = 0; i < tocEntriesToRemove.length; i++) {
619 toc.removeChild(tocEntriesToRemove[i]);
620 }
621
622 // Rebuild TOC entries.
Junio C Hamanof2b74942012-11-20 21:06:26623 var entries = tocEntries(document.getElementById("content"), toclevels);
624 for (var i = 0; i < entries.length; ++i) {
625 var entry = entries[i];
626 if (entry.element.id == "")
627 entry.element.id = "_toc_" + i;
628 var a = document.createElement("a");
629 a.href = "#" + entry.element.id;
630 a.appendChild(document.createTextNode(entry.text));
631 var div = document.createElement("div");
632 div.appendChild(a);
633 div.className = "toclevel" + entry.toclevel;
634 toc.appendChild(div);
635 }
636 if (entries.length == 0)
637 toc.parentNode.removeChild(toc);
638},
639
640
641/////////////////////////////////////////////////////////////////////
642// Footnotes generator
643/////////////////////////////////////////////////////////////////////
644
645/* Based on footnote generation code from:
646 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
647 */
648
649footnotes: function () {
Junio C Hamano9d971152012-12-19 00:43:11650 // Delete existing footnote entries in case we're reloading the footnodes.
651 var i;
Junio C Hamanof2b74942012-11-20 21:06:26652 var noteholder = document.getElementById("footnotes");
Junio C Hamano9d971152012-12-19 00:43:11653 if (!noteholder) {
654 return;
655 }
656 var entriesToRemove = [];
657 for (i = 0; i < noteholder.childNodes.length; i++) {
658 var entry = noteholder.childNodes[i];
Junio C Hamano61525f92014-01-17 22:46:49659 if (entry.nodeName == 'div' && entry.getAttribute("class") == "footnote")
Junio C Hamano9d971152012-12-19 00:43:11660 entriesToRemove.push(entry);
661 }
662 for (i = 0; i < entriesToRemove.length; i++) {
663 noteholder.removeChild(entriesToRemove[i]);
664 }
665
666 // Rebuild footnote entries.
667 var cont = document.getElementById("content");
Junio C Hamanof2b74942012-11-20 21:06:26668 var spans = cont.getElementsByTagName("span");
669 var refs = {};
670 var n = 0;
671 for (i=0; i<spans.length; i++) {
672 if (spans[i].className == "footnote") {
673 n++;
Junio C Hamano9d971152012-12-19 00:43:11674 var note = spans[i].getAttribute("data-note");
675 if (!note) {
676 // Use [\s\S] in place of . so multi-line matches work.
677 // Because JavaScript has no s (dotall) regex flag.
678 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
679 spans[i].innerHTML =
680 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
681 "' title='View footnote' class='footnote'>" + n + "</a>]";
682 spans[i].setAttribute("data-note", note);
683 }
Junio C Hamanof2b74942012-11-20 21:06:26684 noteholder.innerHTML +=
685 "<div class='footnote' id='_footnote_" + n + "'>" +
686 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
687 n + "</a>. " + note + "</div>";
Junio C Hamanof2b74942012-11-20 21:06:26688 var id =spans[i].getAttribute("id");
689 if (id != null) refs["#"+id] = n;
690 }
691 }
692 if (n == 0)
693 noteholder.parentNode.removeChild(noteholder);
694 else {
695 // Process footnoterefs.
696 for (i=0; i<spans.length; i++) {
697 if (spans[i].className == "footnoteref") {
698 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
699 href = href.match(/#.*/)[0]; // Because IE return full URL.
700 n = refs[href];
701 spans[i].innerHTML =
702 "[<a href='#_footnote_" + n +
703 "' title='View footnote' class='footnote'>" + n + "</a>]";
704 }
705 }
706 }
Junio C Hamano9d971152012-12-19 00:43:11707},
708
709install: function(toclevels) {
710 var timerId;
711
712 function reinstall() {
713 asciidoc.footnotes();
714 if (toclevels) {
715 asciidoc.toc(toclevels);
716 }
717 }
718
719 function reinstallAndRemoveTimer() {
720 clearInterval(timerId);
721 reinstall();
722 }
723
724 timerId = setInterval(reinstall, 500);
725 if (document.addEventListener)
726 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
727 else
728 window.onload = reinstallAndRemoveTimer;
Junio C Hamanof2b74942012-11-20 21:06:26729}
730
731}
Junio C Hamano9d971152012-12-19 00:43:11732asciidoc.install();
Junio C Hamanof2b74942012-11-20 21:06:26733/*]]>*/
734</script>
735</head>
Junio C Hamano9d971152012-12-19 00:43:11736<body class="article">
Junio C Hamanof2b74942012-11-20 21:06:26737<div id="header">
Junio C Hamano076ffcc2013-02-06 05:13:21738<h1>Git pack format</h1>
Junio C Hamanof2b74942012-11-20 21:06:26739</div>
740<div id="content">
Junio C Hamano9d971152012-12-19 00:43:11741<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:26742<h2 id="_pack_pack_files_have_the_following_format">pack-*.pack files have the following format:</h2>
743<div class="sectionbody">
744<div class="ulist"><ul>
745<li>
746<p>
747A header appears at the beginning and consists of the following:
748</p>
749<div class="literalblock">
750<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49751<pre><tt>4-byte signature:
752 The signature is: {'P', 'A', 'C', 'K'}</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26753</div></div>
754<div class="literalblock">
755<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49756<pre><tt>4-byte version number (network byte order):
Junio C Hamano076ffcc2013-02-06 05:13:21757 Git currently accepts version number 2 or 3 but
Junio C Hamano61525f92014-01-17 22:46:49758 generates version 2 only.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26759</div></div>
760<div class="literalblock">
761<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49762<pre><tt>4-byte number of objects contained in the pack (network byte order)</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26763</div></div>
764<div class="literalblock">
765<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49766<pre><tt>Observation: we cannot have more than 4G versions ;-) and
767more than 4G objects in a pack.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26768</div></div>
769</li>
770<li>
771<p>
772The header is followed by number of object entries, each of
773 which looks like this:
774</p>
775<div class="literalblock">
776<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49777<pre><tt>(undeltified representation)
Junio C Hamanof2b74942012-11-20 21:06:26778n-byte type and length (3-bit type, (n-1)*7+4-bit length)
Junio C Hamano61525f92014-01-17 22:46:49779compressed data</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26780</div></div>
781<div class="literalblock">
782<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49783<pre><tt>(deltified representation)
Junio C Hamanof2b74942012-11-20 21:06:26784n-byte type and length (3-bit type, (n-1)*7+4-bit length)
Junio C Hamanoa080bc32013-04-12 21:33:0178520-byte base object name if OBJ_REF_DELTA or a negative relative
786 offset from the delta object's position in the pack if this
787 is an OBJ_OFS_DELTA object
Junio C Hamano61525f92014-01-17 22:46:49788compressed delta data</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26789</div></div>
790<div class="literalblock">
791<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49792<pre><tt>Observation: length of each object is encoded in a variable
793length format and is not constrained to 32-bit or anything.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26794</div></div>
795</li>
796<li>
797<p>
Junio C Hamanoe3f080d2013-04-22 02:27:13798The trailer records 20-byte SHA-1 checksum of all of the above.
Junio C Hamanof2b74942012-11-20 21:06:26799</p>
800</li>
801</ul></div>
802</div>
Junio C Hamano9d971152012-12-19 00:43:11803</div>
804<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:26805<h2 id="_original_version_1_pack_idx_files_have_the_following_format">Original (version 1) pack-*.idx files have the following format:</h2>
806<div class="sectionbody">
807<div class="ulist"><ul>
808<li>
809<p>
810The header consists of 256 4-byte network byte order
811 integers. N-th entry of this table records the number of
812 objects in the corresponding pack, the first byte of whose
813 object name is less than or equal to N. This is called the
814 <em>first-level fan-out</em> table.
815</p>
816</li>
817<li>
818<p>
819The header is followed by sorted 24-byte entries, one entry
820 per object in the pack. Each entry is:
821</p>
822<div class="literalblock">
823<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49824<pre><tt>4-byte network byte order integer, recording where the
Junio C Hamanof2b74942012-11-20 21:06:26825object is stored in the packfile as the offset from the
Junio C Hamano61525f92014-01-17 22:46:49826beginning.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26827</div></div>
828<div class="literalblock">
829<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49830<pre><tt>20-byte object name.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26831</div></div>
832</li>
833<li>
834<p>
835The file is concluded with a trailer:
836</p>
837<div class="literalblock">
838<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49839<pre><tt>A copy of the 20-byte SHA-1 checksum at the end of
840corresponding packfile.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26841</div></div>
842<div class="literalblock">
843<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49844<pre><tt>20-byte SHA-1-checksum of all of the above.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26845</div></div>
846</li>
847</ul></div>
848<div class="paragraph"><p>Pack Idx file:</p></div>
849<div class="literalblock">
850<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49851<pre><tt> -- +--------------------------------+
Junio C Hamanof2b74942012-11-20 21:06:26852fanout | fanout[0] = 2 (for example) |-.
853table +--------------------------------+ |
854 | fanout[1] | |
855 +--------------------------------+ |
856 | fanout[2] | |
857 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
858 | fanout[255] = total objects |---.
859 -- +--------------------------------+ | |
860main | offset | | |
861index | object name 00XXXXXXXXXXXXXXXX | | |
862table +--------------------------------+ | |
863 | offset | | |
864 | object name 00XXXXXXXXXXXXXXXX | | |
865 +--------------------------------+&lt;+ |
866 .-| offset | |
867 | | object name 01XXXXXXXXXXXXXXXX | |
868 | +--------------------------------+ |
869 | | offset | |
870 | | object name 01XXXXXXXXXXXXXXXX | |
871 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
872 | | offset | |
873 | | object name FFXXXXXXXXXXXXXXXX | |
874 --| +--------------------------------+&lt;--+
875trailer | | packfile checksum |
876 | +--------------------------------+
877 | | idxfile checksum |
878 | +--------------------------------+
879 .-------.
880 |
Junio C Hamano61525f92014-01-17 22:46:49881Pack file entry: &lt;+</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26882</div></div>
883<div class="literalblock">
884<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49885<pre><tt>packed object header:
Junio C Hamanof2b74942012-11-20 21:06:26886 1-byte size extension bit (MSB)
887 type (next 3 bit)
888 size0 (lower 4-bit)
889 n-byte sizeN (as long as MSB is set, each 7-bit)
890 size0..sizeN form 4+7+7+..+7 bit integer, size0
891 is the least significant part, and sizeN is the
892 most significant part.
893packed object data:
894 If it is not DELTA, then deflated bytes (the size above
895 is the size before compression).
896 If it is REF_DELTA, then
Junio C Hamanoe3f080d2013-04-22 02:27:13897 20-byte base object name SHA-1 (the size above is the
Junio C Hamanof2b74942012-11-20 21:06:26898 size of the delta data that follows).
899 delta data, deflated.
900 If it is OFS_DELTA, then
901 n-byte offset (see below) interpreted as a negative
902 offset from the type-byte of the header of the
903 ofs-delta entry (the size above is the size of
904 the delta data that follows).
Junio C Hamano61525f92014-01-17 22:46:49905 delta data, deflated.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26906</div></div>
907<div class="literalblock">
908<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49909<pre><tt>offset encoding:
Junio C Hamanof2b74942012-11-20 21:06:26910 n bytes with MSB set in all but the last one.
911 The offset is then the number constructed by
912 concatenating the lower 7 bit of each byte, and
913 for n &gt;= 2 adding 2^7 + 2^14 + ... + 2^(7*(n-1))
Junio C Hamano61525f92014-01-17 22:46:49914 to the result.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26915</div></div>
916</div>
Junio C Hamano9d971152012-12-19 00:43:11917</div>
918<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:26919<h2 id="_version_2_pack_idx_files_support_packs_larger_than_4_gib_and">Version 2 pack-*.idx files support packs larger than 4 GiB, and</h2>
920<div class="sectionbody">
921<div class="literalblock">
922<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49923<pre><tt>have some other reorganizations. They have the format:</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26924</div></div>
925<div class="ulist"><ul>
926<li>
927<p>
928A 4-byte magic number <em>\377tOc</em> which is an unreasonable
929 fanout[0] value.
930</p>
931</li>
932<li>
933<p>
934A 4-byte version number (= 2)
935</p>
936</li>
937<li>
938<p>
939A 256-entry fan-out table just like v1.
940</p>
941</li>
942<li>
943<p>
Junio C Hamanoe3f080d2013-04-22 02:27:13944A table of sorted 20-byte SHA-1 object names. These are
Junio C Hamanof2b74942012-11-20 21:06:26945 packed together without offset values to reduce the cache
946 footprint of the binary search for a specific object name.
947</p>
948</li>
949<li>
950<p>
951A table of 4-byte CRC32 values of the packed object data.
952 This is new in v2 so compressed data can be copied directly
953 from pack to pack during repacking without undetected
954 data corruption.
955</p>
956</li>
957<li>
958<p>
959A table of 4-byte offset values (in network byte order).
960 These are usually 31-bit pack file offsets, but large
961 offsets are encoded as an index into the next table with
962 the msbit set.
963</p>
964</li>
965<li>
966<p>
967A table of 8-byte offset entries (empty for pack files less
968 than 2 GiB). Pack files are organized with heavily used
969 objects toward the front, so most object references should
970 not need to refer to this table.
971</p>
972</li>
973<li>
974<p>
975The same trailer as a v1 pack file:
976</p>
977<div class="literalblock">
978<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49979<pre><tt>A copy of the 20-byte SHA-1 checksum at the end of
980corresponding packfile.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26981</div></div>
982<div class="literalblock">
983<div class="content">
Junio C Hamano61525f92014-01-17 22:46:49984<pre><tt>20-byte SHA-1-checksum of all of the above.</tt></pre>
Junio C Hamanof2b74942012-11-20 21:06:26985</div></div>
986</li>
987</ul></div>
988</div>
989</div>
Junio C Hamano9d971152012-12-19 00:43:11990</div>
Junio C Hamanof2b74942012-11-20 21:06:26991<div id="footnotes"><hr /></div>
992<div id="footer">
993<div id="footer-text">
Junio C Hamano683a8612013-08-23 20:50:09994Last updated 2013-08-20 08:40:27 PDT
Junio C Hamanof2b74942012-11-20 21:06:26995</div>
996</div>
997</body>
998</html>