Loose objects (one file per object under .git/objects/xx/...) become slow when you have millions. git gc consolidates them into packfiles.
A pack:
.git/objects/pack/pack-abc.pack — concatenated objects, delta-compressed
.git/objects/pack/pack-abc.idx — index for fast lookup
Delta compression: instead of storing every version of a file, Git stores one full version + a chain of binary diffs. git pack-objects picks similar objects and chains them.
For a busy repo with many commits to the same file, the pack might be 100× smaller than the loose objects.
Auto-pack triggers (configurable):
- After ~6700 loose objects
- After ~50 packs
- On
git gc (manual)
Inspect:
git verify-pack -v .git/objects/pack/pack-*.idx | head