GITFORMAT-PACK(5) Git Manual GITFORMAT-PACK(5) (NAME) gitformat-pack - (pack) (SYNOPSIS) $GIT_DIR/objects/pack/pack-.{pack,idx} $GIT_DIR/objects/pack/pack-.rev $GIT_DIR/objects/pack/pack-*.mtimes $GIT_DIR/objects/pack/multi-pack-index (DESCRIPTION) (pack format) . (loose objects - ) () . git-gc(1) git-pack-objects(1). (over-the-wire) gitprotocol-v2(5) gitformat-bundle(5) . (CHECKSUMS AND OBJECT IDS) SHA-1 ( ) SHA-1 . SHA-256 SHA-256 . CRC32 ( n-) . CRC32 zlib . PACK-*.PACK : o : : : {'P', 'A', 'C', 'K'} ( - network byte order): . ( ) : ;) . o : ( - undeltified) n- ( (n-1)*7+4 ) ( - deltified) n- ( (n-1)*7+4 ) OBJ_REF_DELTA OBJ_OFS_DELTA : . o (trailer) . (Object types) : o OBJ_COMMIT (1) o OBJ_TREE (2) o OBJ_BLOB (3) o OBJ_TAG (4) o OBJ_OFS_DELTA (6) o OBJ_REF_DELTA (7) . . (Object encoding) (loose objects) NUL . n- . (object ID) . (Size encoding) " " : . (MSB) MSB . . . " " . . . . (Deltified representation) : commit tree tag blob. "" "" . ofs-delta ref-delta . ofs-delta ref-delta "" ( ) . ref-delta . ofs-delta . . Ref-delta ( " " thin pack). (self contained) . . . . . . : . . . RFC 1951 ( Deflate) . +----------+---------+---------+---------+---------+-------+-------+-------+ | 1xxxxxxx | offset1 | offset2 | offset3 | offset4 | size1 | size2 | size3 | +----------+---------+---------+---------+---------+-------+-------+-------+ . . (little-endian) . . . . offset1 . offset2 . . offset2 offset3 . offset2 offset1 . +----------+---------+---------+ | 10000101 | offset1 | offset3 | +----------+---------+---------+ (0x80) . : 0x10000 . +----------+============+ | 0xxxxxxx | data | +----------+============+ . . . . +----------+============ | 00000000 | +----------+============ . PACK-*.IDX ( ) : o . N- N . (first-level fan-out) . o . : . . o ( ) : . . Pack Idx file: -- +--------------------------------+ fanout | fanout[0] = 2 (for example) |-. table +--------------------------------+ | | fanout[1] | | +--------------------------------+ | | fanout[2] | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | fanout[255] = total objects |---. -- +--------------------------------+ | | main | offset | | | index | object name 00XXXXXXXXXXXXXXXX | | | table +--------------------------------+ | | | offset | | | | object name 00XXXXXXXXXXXXXXXX | | | +--------------------------------+<+ | .-| offset | | | | object name 01XXXXXXXXXXXXXXXX | | | +--------------------------------+ | | | offset | | | | object name 01XXXXXXXXXXXXXXXX | | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | offset | | | | object name FFXXXXXXXXXXXXXXXX | | --| +--------------------------------+<--+ trailer | | packfile checksum | | +--------------------------------+ | | idxfile checksum | | +--------------------------------+ .-------. | Pack file entry: <+ packed object header: 1-byte size extension bit (MSB) type (next 3 bit) size0 (lower 4-bit) n-byte sizeN (as long as MSB is set, each 7-bit) size0..sizeN form 4+7+7+..+7 bit integer, size0 is the least significant part, and sizeN is the most significant part. packed object data: If it is not DELTA, then deflated bytes (the size above is the size before compression). If it is REF_DELTA, then base object name (the size above is the size of the delta 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. PACK-*.IDX . : o \377tOc fanout[0] . o (= 2) o (fan-out) . o . . o CRC32 . (repacking) . o ( ). msbit . o ( ). . o : . . PACK-*.REV : o 0x52494458 (RIDX). o (= 1). o (= 1 SHA-1 2 SHA-256). o ( num_objects ) . o : . . PACK-*.MTIMES : . o 0x4d544d45 (MTME). o (= 1). o (= 1 SHA-1 2 SHA-256). o . i- (mtime) i- () . mtime (epoch) . o ( ). MULTI-PACK-INDEX (MIDX) : multi-pack-index . MIDX "" (chunks) . MIDX . . (HEADER): : : {'M', 'I', 'D', 'X'} : "midx.version" . . (Object Id Version): (OIDs) : 1 => SHA-1 2 => SHA-256 multi-pack-index . "" : . (CHUNK LOOKUP): (C + 1) * 12 : . . . ( .) CHUNK LOOKUP linkgit:gitformat-chunk[5]. . . (CHUNK DATA): (: {'P', 'N', 'A', 'M'}) NUL . . NUL . MIDX MIDX . (: {'B', 'T', 'M', 'P'}) . ( `PNAM` ). : - ( ) . - . OID (: {'O', 'I', 'D', 'F'}) i- F[i] OID i . F[255] . OID (: {'O', 'I', 'D', 'L'}) OID MIDX . (: {'O', 'O', 'F', 'F'}) . : pack-int-id . : . 2^32 IDX v1 . 2^32-1 2^31-1 . . [] (: {'L', 'O', 'F', 'F'}) . [] (: {'R', 'I', 'D', 'X'}) MIDX ( MIDX num_objects ) / . (TRAILER): . (MULTI-PACK-INDEX REVERSE INDEXES) (multi-pack index) . MIDX (pseudo-pack) MIDX ( i- MIDX i- ). ( ). MIDX MIDX . oid MIDX . oid (locality) . ( .idx). MIDX ( ). MIDX . MIDX (a b c) : |a,0|a,1|...|a,9|b,0|b,1|...|b,14|c,0|c,1|...|c,19| MIDX . ( (c,1) "a" "b" ). : MIDX ( ). . . . MIDX . MIDX . pack(o) o MIDX ( MIDX ) . offset(o) o pack(o) . o1 o2 : o pack(o1) pack(o2) . ( MIDX MIDX ). o pack(o1) != pack(o2) . o pack(o1) = pack(o2) ( o1 o2 offset(o1) < offset(o2) ). MIDX MIDX MIDX ( ). MIDX RIDX MIDX . BTMP (BTMP chunk) (BTMP) . MIDX "" ( ) . "a" "b" "c" . : |a,0|a,1|...|a,9|b,0|b,1|...|b,14|c,0|c,1|...|c,19| ( ) git- pack-objects(1) <<>> (verbatim) . . : o ( ). o . BTMP . BTMP ( ) p MIDX : bitmap_pos ( ) p . bitmap_nr ( bitmap_pos) p . BTMP ( <> <> <>) : +-------------+------------+-----------+ | | bitmap_pos | bitmap_nr | +-------------+------------+-----------+ |packfile "a" | 0 | 10 | +-------------+------------+-----------+ |packfile "b" | 10 | 15 | +-------------+------------+-----------+ |packfile "c" | 25 | 20 | +-------------+------------+-----------+ BTMP . (CRUFT PACKS) (cruft packs) . (pruning) . (Background) git repack -Ad ( git-repack(1)). : [...] . [...] 'git gc' . (push) (race) . git-prune(1) . mtime . ( ) mtime . mtime . . .git/objects . inode (inode starvation) . zlib . (Cruft packs) mtime . git repack --cruft ( --cruft git-pack-objects(1)). git repack --cruft (all-into-one) . --cruft git repack ( ). : 1. () (kept-pack) () mtime (traversal tip). 2. . 3. .mtimes . git-repack(1) . (in-core kept packs) repack . git repack --cruft . git repack --cruft-expiration git-gc(1) . git-gc(1) . (Alternatives) : o mtime . mtime .idx . .idx .mtimes .idx . (GIT) git(1) Git 2.55.0 2026-06-29 GITFORMAT-PACK(5)