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">
6 <meta http-equiv=
"Content-Type" content=
"application/xhtml+xml; charset=UTF-8" />
7 <meta name=
"generator" content=
"AsciiDoc 10.2.0" />
8 <title>GIT bitmap v1 format
</title>
9 <style type=
"text/css">
10 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
14 font-family: Georgia,serif;
18 h1, h2, h3, h4, h5, h6,
19 div.title, caption.title,
20 thead, p.table.header,
22 #author, #revnumber, #revdate, #revremark,
24 font-family: Arial,Helvetica,sans-serif;
28 margin:
1em
5%
1em
5%;
33 text-decoration: underline;
49 h1, h2, h3, h4, h5, h6 {
57 border-bottom:
2px solid silver;
77 border:
1px solid silver;
88 ul
> li { color: #aaa; }
89 ul
> li
> * { color: black; }
91 .monospaced, code, pre {
92 font-family:
"Courier New", Courier, monospace;
99 white-space: pre-wrap;
109 #revnumber, #revdate, #revremark {
114 border-top:
2px solid silver;
120 padding-bottom:
0.5em;
124 padding-bottom:
0.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 {
135 margin-bottom:
1.5em;
137 div.admonitionblock {
139 margin-bottom:
2.0em;
144 div.content { /* Block element content. */
148 /* Block element titles. */
149 div.title, caption.title {
154 margin-bottom:
0.5em;
160 td div.title:first-child {
163 div.content div.title:first-child {
166 div.content + div.title {
170 div.sidebarblock
> div.content {
172 border:
1px solid #dddddd;
173 border-left:
4px solid #f0f0f0;
177 div.listingblock
> div.content {
178 border:
1px solid #dddddd;
179 border-left:
5px solid #f0f0f0;
184 div.quoteblock, div.verseblock {
188 border-left:
5px solid #f0f0f0;
192 div.quoteblock
> div.attribution {
197 div.verseblock
> pre.content {
198 font-family: inherit;
201 div.verseblock
> div.attribution {
205 /* DEPRECATED: Pre version
8.2.7 verse style literal block. */
206 div.verseblock + div.attribution {
210 div.admonitionblock .icon {
214 text-decoration: underline;
216 padding-right:
0.5em;
218 div.admonitionblock td.content {
220 border-left:
3px solid #dddddd;
223 div.exampleblock
> div.content {
224 border-left:
3px solid #dddddd;
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; }
234 margin-bottom:
0.8em;
247 list-style-position: outside;
250 list-style-type: decimal;
253 list-style-type: lower-alpha;
256 list-style-type: upper-alpha;
259 list-style-type: lower-roman;
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 {
269 margin-bottom:
0.1em;
281 margin-bottom:
0.8em;
284 padding-bottom:
15px;
286 dt.hdlist1.strong, td.hdlist1.strong {
292 padding-right:
0.8em;
298 div.hdlist.compact tr {
307 .footnote, .footnoteref {
311 span.footnote, span.footnoteref {
312 vertical-align: super;
316 margin:
20px
0 20px
0;
320 #footnotes div.footnote {
326 border-top:
1px solid silver;
335 padding-right:
0.5em;
336 padding-bottom:
0.3em;
344 #footer-badges { display: none; }
348 margin-bottom:
2.5em;
356 margin-bottom:
0.1em;
359 div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
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; }
427 margin-bottom:
1.5em;
429 div.tableblock
> table {
430 border:
3px solid #
527bbd;
432 thead, p.table.header {
439 /* Because the table frame attribute is overridden by CSS in most browsers. */
440 div.tableblock
> table[
frame=
"void"] {
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;
460 margin-bottom:
1.5em;
462 thead, p.tableblock.header {
473 border-color: #
527bbd;
474 border-collapse: collapse;
476 th.tableblock, td.tableblock {
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 {
498 th.tableblock.halign-center, td.tableblock.halign-center {
501 th.tableblock.halign-right, td.tableblock.halign-right {
505 th.tableblock.valign-top, td.tableblock.valign-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;
523 padding-bottom:
0.5em;
524 border-top:
2px solid silver;
525 border-bottom:
2px solid silver;
530 body.manpage div.sectionbody {
535 body.manpage div#toc { display: none; }
540 <script type=
"text/javascript">
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
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 */
562 toc: function (toclevels) {
564 function getText(el) {
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType ==
3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
569 else if (i.firstChild != null)
575 function TocEntry(el, text, toclevel) {
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
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);
602 var toc = document.getElementById(
"toc");
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
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");
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.
651 var noteholder = document.getElementById(
"footnotes");
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");
670 for (i=
0; i
<spans.length; i++) {
671 if (spans[i].className ==
"footnote") {
673 var note = spans[i].getAttribute(
"data-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];
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;
692 noteholder.parentNode.removeChild(noteholder);
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.
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n +
"</a>]";
708 install: function(toclevels) {
711 function reinstall() {
712 asciidoc.footnotes();
714 asciidoc.toc(toclevels);
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
723 timerId = setInterval(reinstall,
500);
724 if (document.addEventListener)
725 document.addEventListener(
"DOMContentLoaded", reinstallAndRemoveTimer, false);
727 window.onload = reinstallAndRemoveTimer;
735 <body class=
"article">
737 <h1>GIT bitmap v1 format
</h1>
738 <span id=
"revdate">2024-
04-
19</span>
742 <h2 id=
"_pack_and_multi_pack_bitmaps">Pack and multi-pack bitmaps
</h2>
743 <div class=
"sectionbody">
744 <div class=
"paragraph"><p>Bitmaps store reachability information about the set of objects in a packfile,
745 or a multi-pack index (MIDX). The former is defined obviously, and the latter is
746 defined as the union of objects in packs contained in the MIDX.
</p></div>
747 <div class=
"paragraph"><p>A bitmap may belong to either one pack, or the repository
’s multi-pack index (if
748 it exists). A repository may have at most one bitmap.
</p></div>
749 <div class=
"paragraph"><p>An object is uniquely described by its bit position within a bitmap:
</p></div>
750 <div class=
"ulist"><ul>
753 If the bitmap belongs to a packfile, the
<em>n
</em>th bit corresponds to
754 the
<em>n
</em>th object in pack order. For a function
<code>offset
</code> which maps
755 objects to their byte offset within a pack, pack order is defined as
758 <div class=
"literalblock">
759 <div class=
"content">
760 <pre><code>o1
<= o2
<==
> offset(o1)
<= offset(o2)
</code></pre>
765 If the bitmap belongs to a MIDX, the
<em>n
</em>th bit corresponds to the
766 <em>n
</em>th object in MIDX order. With an additional function
<code>pack
</code> which
767 maps objects to the pack they were selected from by the MIDX, MIDX order
768 is defined as follows:
770 <div class=
"literalblock">
771 <div class=
"content">
772 <pre><code>o1
<= o2
<==
> pack(o1)
<= pack(o2) /\ offset(o1)
<= offset(o2)
</code></pre>
774 <div class=
"paragraph"><p>The ordering between packs is done according to the MIDX
’s .rev file.
775 Notably, the preferred pack sorts ahead of all other packs.
</p></div>
778 <div class=
"paragraph"><p>The on-disk representation (described below) of a bitmap is the same regardless
779 of whether or not that bitmap belongs to a packfile or a MIDX. The only
780 difference is the interpretation of the bits, which is described above.
</p></div>
781 <div class=
"paragraph"><p>Certain bitmap extensions are supported (see: Appendix B). No extensions are
782 required for bitmaps corresponding to packfiles. For bitmaps that correspond to
783 MIDXs, both the bit-cache and rev-cache extensions are required.
</p></div>
787 <h2 id=
"_on_disk_format">On-disk format
</h2>
788 <div class=
"sectionbody">
789 <div class=
"ulist"><ul>
792 A header appears at the beginning:
794 <div class=
"dlist"><dl>
800 {
<em>B
</em>,
<em>I
</em>,
<em>T
</em>,
<em>M
</em>}
804 2-byte version number (network byte order):
808 The current implementation only supports version
1
809 of the bitmap index (the same one as JGit).
813 2-byte flags (network byte order):
817 The following flags are supported:
819 <div class=
"ulist"><ul>
823 <div class=
"dlist"><dl>
825 BITMAP_OPT_FULL_DAG (
0x1) REQUIRED:
829 This flag must always be present. It implies that the
830 bitmap index has been generated for a packfile or
831 multi-pack index (MIDX) with full closure (i.e. where
832 every single object in the packfile/MIDX can find its
833 parent links inside the same packfile/MIDX). This is a
834 requirement for the bitmap index format, also present in
835 JGit, that greatly reduces the complexity of the
844 <div class=
"dlist"><dl>
846 BITMAP_OPT_HASH_CACHE (
0x4):
850 If present, the end of the bitmap file contains
851 <code>N
</code> 32-bit name-hash values, one per object in the
852 pack/MIDX. The format and meaning of the name-hash is
861 <div class=
"dlist"><dl>
863 BITMAP_OPT_LOOKUP_TABLE (
0x10):
867 If present, the end of the bitmap file contains a table
868 containing a list of
<code>N
</code> <commit_pos, offset, xor_row
>
869 triplets. The format and meaning of the table is described
872 <div class=
"admonitionblock">
875 <div class=
"title">Note
</div>
877 <td class=
"content">Unlike the xor_offset used to compress an individual bitmap,
878 <code>xor_row
</code> stores an
<strong>absolute
</strong> index into the lookup table, not a location
879 relative to the current entry.
</td>
888 4-byte entry count (network byte order):
892 The total count of entries (bitmapped commits) in this bitmap index.
900 The SHA1 checksum of the pack/MIDX this bitmap index
908 4 EWAH bitmaps that act as type indexes
910 <div class=
"paragraph"><p>Type indexes are serialized after the hash cache in the shape
911 of four EWAH bitmaps stored consecutively (see Appendix A for
912 the serialization format of an EWAH bitmap).
</p></div>
913 <div class=
"paragraph"><p>There is a bitmap for each Git object type, stored in the following
915 <div class=
"ulist"><ul>
937 <div class=
"paragraph"><p>In each bitmap, the `n`th bit is set to true if the `n`th object
938 in the packfile or multi-pack index is of that type.
</p></div>
939 <div class=
"paragraph"><p>The obvious consequence is that the OR of all
4 bitmaps will result
940 in a full set (all bits set), and the AND of all
4 bitmaps will
941 result in an empty bitmap (no bits set).
</p></div>
945 N entries with compressed bitmaps, one for each indexed commit
947 <div class=
"paragraph"><p>Where
<code>N
</code> is the total number of entries in this bitmap index.
948 Each entry contains the following:
</p></div>
949 <div class=
"ulist"><ul>
953 <div class=
"dlist"><dl>
955 4-byte object position (network byte order):
959 The position
<strong>in the index for the packfile or
960 multi-pack index
</strong> where the bitmap for this commit is
969 <div class=
"dlist"><dl>
975 The xor offset used to compress this bitmap. For an entry
976 in position
<code>x
</code>, an XOR offset of
<code>y
</code> means that the actual
977 bitmap representing this commit is composed by XORing the
978 bitmap for this entry with the bitmap in entry
<code>x-y
</code> (i.e.
979 the bitmap
<code>y
</code> entries before this one).
981 <div class=
"admonitionblock">
984 <div class=
"title">Note
</div>
986 <td class=
"content">This compression can be recursive. In order to
987 XOR this entry with a previous one, the previous entry needs
988 to be decompressed first, and so on.
</td>
991 <div class=
"paragraph"><p>The hard-limit for this offset is
160 (an entry can only be
992 xor
’ed against one of the
160 entries preceding it). This
993 number is always positive, and hence entries are always xor
’ed
994 with
<strong>previous
</strong> bitmaps, not bitmaps that will come afterwards
995 in the index.
</p></div>
1002 <div class=
"dlist"><dl>
1003 <dt class=
"hdlist1">
1004 1-byte flags for this bitmap:
1008 At the moment the only available flag is
<code>0x1</code>, which hints
1009 that this bitmap can be re-used when rebuilding bitmap indexes
1017 The compressed bitmap itself, see Appendix A.
1025 <div class=
"dlist"><dl>
1026 <dt class=
"hdlist1">
1031 Trailing checksum of the preceding contents.
1040 <h2 id=
"_appendix_a_serialization_format_for_an_ewah_bitmap">Appendix A: Serialization format for an EWAH bitmap
</h2>
1041 <div class=
"sectionbody">
1042 <div class=
"paragraph"><p>Ewah bitmaps are serialized in the same protocol as the JAVAEWAH
1043 library, making them backwards compatible with the JGit
1044 implementation:
</p></div>
1045 <div class=
"ulist"><ul>
1048 4-byte number of bits of the resulting UNCOMPRESSED bitmap
1053 4-byte number of words of the COMPRESSED bitmap, when stored
1058 N x
8-byte words, as specified by the previous field
1060 <div class=
"paragraph"><p>This is the actual content of the compressed bitmap.
</p></div>
1064 4-byte position of the current RLW for the compressed
1069 <div class=
"paragraph"><p>All words are stored in network byte order for their corresponding
1071 <div class=
"paragraph"><p>The compressed bitmap is stored in a form of run-length encoding, as
1072 follows. It consists of a concatenation of an arbitrary number of
1073 chunks. Each chunk consists of one or more
64-bit words
</p></div>
1074 <div class=
"literalblock">
1075 <div class=
"content">
1076 <pre><code>H L_1 L_2 L_3 .... L_M
</code></pre>
1078 <div class=
"paragraph"><p>H is called RLW (run length word). It consists of (from lower to higher
1079 order bits):
</p></div>
1080 <div class=
"ulist"><ul>
1083 1 bit: the repeated bit B
1088 32 bits: repetition count K (unsigned)
1093 31 bits: literal word count M (unsigned)
1097 <div class=
"paragraph"><p>The bitstream represented by the above chunk is then:
</p></div>
1098 <div class=
"ulist"><ul>
1106 The bits stored in
<code>L_1
</code> through
<code>L_M
</code>. Within a word, bits at
1107 lower order come earlier in the stream than those at higher
1112 <div class=
"paragraph"><p>The next word after
<code>L_M
</code> (if any) must again be a RLW, for the next
1113 chunk. For efficient appending to the bitstream, the EWAH stores a
1114 pointer to the last RLW in the stream.
</p></div>
1118 <h2 id=
"_appendix_b_optional_bitmap_sections">Appendix B: Optional Bitmap Sections
</h2>
1119 <div class=
"sectionbody">
1120 <div class=
"paragraph"><p>These sections may or may not be present in the
<code>.bitmap
</code> file; their
1121 presence is indicated by the header flags section described above.
</p></div>
1125 <h2 id=
"_name_hash_cache">Name-hash cache
</h2>
1126 <div class=
"sectionbody">
1127 <div class=
"paragraph"><p>If the BITMAP_OPT_HASH_CACHE flag is set, the end of the bitmap contains
1128 a cache of
32-bit values, one per object in the pack/MIDX. The value at
1129 position
<code>i
</code> is the hash of the pathname at which the `i`th object
1130 (counting in index or multi-pack index order) in the pack/MIDX can be found.
1131 This can be fed into the delta heuristics to compare objects with similar
1132 pathnames.
</p></div>
1133 <div class=
"paragraph"><p>The hash algorithm used is:
</p></div>
1134 <div class=
"literalblock">
1135 <div class=
"content">
1136 <pre><code>hash =
0;
1137 while ((c = *name++))
1139 hash = (hash
>> 2) + (c
<< 24);
</code></pre>
1141 <div class=
"paragraph"><p>Note that this hashing scheme is tied to the BITMAP_OPT_HASH_CACHE flag.
1142 If implementations want to choose a different hashing scheme, they are
1143 free to do so, but MUST allocate a new header flag (because comparing
1144 hashes made under two different schemes would be pointless).
</p></div>
1148 <h2 id=
"_commit_lookup_table">Commit lookup table
</h2>
1149 <div class=
"sectionbody">
1150 <div class=
"paragraph"><p>If the BITMAP_OPT_LOOKUP_TABLE flag is set, the last
<code>N * (
4 +
8 +
4)
</code>
1151 bytes (preceding the name-hash cache and trailing hash) of the
<code>.bitmap
</code>
1152 file contains a lookup table specifying the information needed to get
1153 the desired bitmap from the entries without parsing previous unnecessary
1155 <div class=
"paragraph"><p>For a
<code>.bitmap
</code> containing
<code>nr_entries
</code> reachability bitmaps, the table
1156 contains a list of
<code>nr_entries
</code> <commit_pos, offset, xor_row
> triplets
1157 (sorted in the ascending order of
<code>commit_pos
</code>). The content of the i
’th
1158 triplet is -
</p></div>
1159 <div class=
"ulist"><ul>
1163 <div class=
"dlist"><dl>
1164 <dt class=
"hdlist1">
1165 commit_pos (
4 byte integer, network byte order):
1169 It stores the object position of a commit (in the midx or pack
1178 <div class=
"dlist"><dl>
1179 <dt class=
"hdlist1">
1180 offset (
8 byte integer, network byte order):
1184 The offset from which that commit
’s bitmap can be read.
1192 <div class=
"dlist"><dl>
1193 <dt class=
"hdlist1">
1194 xor_row (
4 byte integer, network byte order):
1198 The position of the triplet whose bitmap is used to compress
1199 this one, or
<code>0xffffffff</code> if no such bitmap exists.
1208 <div id=
"footnotes"><hr /></div>
1210 <div id=
"footer-text">
1212 2023-
10-
23 14:
43:
46 PDT