Das Cross-Fork-Problem
Forge-Server (GitHub, GitLab) hosten viele Forks eines Repos zusammen. Naiv komprimiert ein einzelnes Packfile Deltas uber alle Forks — effizient auf Disk, aber ineffizient beim Servieren eines einzelnen Forks. Delta-Inseln beschranken Delta-Ketten so, dass die Ketten jedes Forks innerhalb seines eigenen Objekt-Sets bleiben.
Inseln konfigurieren
[pack]
island = refs/heads/main
island = refs/heads/release/*
island = refs/tags/*
Repacking mit Inseln
git repack -adf --window=250 --depth=50
Anwendungsfalle
- Selbstgehostetes Gitea/GitLab/Forgejo mit vielen Forks.
- Interne Mirror, die mehrere interne Repos servieren.
- Backups, die Per-Repo-Snapshots schnell extrahieren mussen.
Nur-Server-Feature
Delta-Inseln zahlen auf dem Server.
Verifikation
git verify-pack -v .git/objects/pack/pack-*.idx | head
GIT_TRACE2_PERF=1 git pack-objects --stdout --revs < refs.txt > out.pack
Haufige Fehler
Inseln zu grob setzen (alles in einer Insel) — kein Nutzen.
Pseudo-Merge-Bitmaps
Modernes Git paart Delta-Inseln mit Pseudo-Merge-Bitmaps.