Home Explore Blog CI



git

4th chunk of `Documentation/gitformat-pack.adoc`
55e6346fe758cc61fa5f834f89c4433849173e962c9174060000000100000fa4
 data that follows).
          delta data, deflated.
	If it is OFS_DELTA, then
	  n-byte offset (see below) interpreted as a negative
		offset from the type-byte of the header of the
		ofs-delta entry (the size above is the size of
		the delta data that follows).
	  delta data, deflated.

     offset encoding:
	  n bytes with MSB set in all but the last one.
	  The offset is then the number constructed by
	  concatenating the lower 7 bit of each byte, and
	  for n >= 2 adding 2^7 + 2^14 + ... + 2^(7*(n-1))
	  to the result.



== Version 2 pack-*.idx files support packs larger than 4 GiB, and
   have some other reorganizations.  They have the format:

  - A 4-byte magic number '\377tOc' which is an unreasonable
    fanout[0] value.

  - A 4-byte version number (= 2)

  - A 256-entry fan-out table just like v1.

  - A table of sorted object names.  These are packed together
    without offset values to reduce the cache footprint of the
    binary search for a specific object name.

  - A table of 4-byte CRC32 values of the packed object data.
    This is new in v2 so compressed data can be copied directly
    from pack to pack during repacking without undetected
    data corruption.

  - A table of 4-byte offset values (in network byte order).
    These are usually 31-bit pack file offsets, but large
    offsets are encoded as an index into the next table with
    the msbit set.

  - A table of 8-byte offset entries (empty for pack files less
    than 2 GiB).  Pack files are organized with heavily used
    objects toward the front, so most object references should
    not need to refer to this table.

  - The same trailer as a v1 pack file:

    A copy of the pack checksum at the end of the
    corresponding packfile.

    Index checksum of all of the above.

== pack-*.rev files have the format:

  - A 4-byte magic number '0x52494458' ('RIDX').

  - A 4-byte version identifier (= 1).

  - A 4-byte hash function identifier (= 1 for SHA-1, 2 for SHA-256).

  - A table of index positions (one per packed object, num_objects in
    total, each a 4-byte unsigned integer in network order), sorted by
    their corresponding offsets in the packfile.

  - A trailer, containing a:

    checksum of the corresponding packfile, and

    a checksum of all of the above.

All 4-byte numbers are in network order.

== pack-*.mtimes files have the format:

All 4-byte numbers are in network byte order.

  - A 4-byte magic number '0x4d544d45' ('MTME').

  - A 4-byte version identifier (= 1).

  - A 4-byte hash function identifier (= 1 for SHA-1, 2 for SHA-256).

  - A table of 4-byte unsigned integers. The ith value is the
    modification time (mtime) of the ith object in the corresponding
    pack by lexicographic (index) order. The mtimes count standard
    epoch seconds.

  - A trailer, containing a checksum of the corresponding packfile,
    and a checksum of all of the above (each having length according
    to the specified hash function).

== multi-pack-index (MIDX) files have the following format:

The multi-pack-index files refer to multiple pack-files and loose objects.

In order to allow extensions that add extra data to the MIDX, we organize
the body into "chunks" and provide a lookup table at the beginning of the
body. The header includes certain length values, such as the number of packs,
the number of base MIDX files, hash lengths and types.

All 4-byte numbers are in network order.

HEADER:

	4-byte signature:
	    The signature is: {'M', 'I', 'D', 'X'}

	1-byte version number:
	    Git only writes or recognizes version 1.

	1-byte Object Id Version
	    We infer the length of object IDs (OIDs) from this value:
		1 => SHA-1
		2 => SHA-256
	    If the hash type does not match the repository's hash algorithm,
	    the multi-pack-index file should be ignored with a warning
	    presented to the user.

	1-byte number of "chunks"

	1-byte number of base multi-pack-index files:
	    This value is currently always zero.

	4-byte number of pack

Title: Git Pack File and Index Formats
Summary
This document describes the formats of various Git files, including pack files, index files, reverse index files, mtime files, and multi-pack-index files, detailing their structures, headers, tables, and trailers, as well as the encoding and organization of data within them.