Übersicht
git pack-objects [--stdout] [--all] <base-name> < <object-list>
Beschreibung
Der git pack-objects-Befehl komprimiert eine Menge von Objekten in eine einzige Pack-Datei und wendet Delta-Kompression auf ähnliche Objekte an. Packs sind die Art, wie Git Objekte effizient auf der Festplatte und über das Netzwerk speichert — jeder Fetch und Push überträgt Packs.
Im täglichen Einsatz integriert sich git pack-objects eng mit Shell-Aliasen, Editor-Plugins und Continuous Integration. Power-User fügen oft Aliase hinzu, die Flags kombinieren, die sie immer übergeben, oder wickeln den Befehl in Skripte, die Teamkonventionen durchsetzen. Die Ausgabeformatierung kann über Git-Config angepasst werden — Pretty-Formate, Farbschemata und Pager-Verhalten sind alle einstellbar. Wenn etwas schiefgeht, ist der erste Diagnoseschritt üblicherweise, den Befehl erneut mit GIT_TRACE=1 in der Umgebung auszuführen, was die zugrunde liegenden Plumbing-Aufrufe offenlegt. Für ungewöhnliche Situationen öffnet die --help-Ausgabe (git pack-objects --help) die vollständige Manpage mit Details zu jeder Option, einschließlich solcher, die in alltäglichen Workflows selten verwendet werden, aber für Debugging oder Skripting im großen Maßstab essentiell sind.
Zu verstehen, wie git pack-objects mit dem Rest von Gits Datenmodell interagiert — der Objektdatenbank, dem Index, Refs und dem Working Tree — zahlt sich aus. Jeder Befehl operiert auf einer Teilmenge dieser Stücke, und zu wissen, welche er berührt, hilft Ergebnisse vorherzusagen und sich von Fehlern zu erholen. Das Lesen der offiziellen Git-Dokumentation neben praktischer Übung in einem Wegwerf-Repository ist der schnellste Weg, die Nuancen zu verinnerlichen. Die meisten Produktionsprobleme mit Git rühren von einer von drei Ursachen: überraschendem Standardverhalten, partiellen Netzwerkoperationen oder dem Umschreiben bereits geteilter Historie. Ein funktionierendes mentales Modell der Nebenwirkungen von git pack-objects hilft, alle drei zu vermeiden.
Häufige Optionen
| Option | Beschreibung |
|---|---|
--stdout | Schreibt das Pack nach stdout statt in Dateien. |
--all | Packt alles, was von einer Ref erreichbar ist. |
--revs | Liest Revisionen von stdin statt Objekt-SHAs. |
--depth=<n> | Maximale Delta-Ketten-Tiefe. |
--window=<n> | Fenstergröße für die Delta-Suche. |
--thin | Erlaubt dünne Packs (Deltas gegen externe Objekte). |
--no-reuse-delta | Berechnet Deltas neu, statt vorhandene wiederzuverwenden. |
Beispiele
git rev-list --objects --all | git pack-objects --stdout > everything.pack
# Ein einzelnes Pack jedes erreichbaren Objekts erstellen
git rev-list --objects HEAD ^origin/main | \
git pack-objects --thin --stdout > ahead.pack
# Ein dünnes Pack nur der Commits, die vor origin/main sind
git pack-objects --all .git/objects/pack/extra
# Alle erreichbaren Objekte in ein neues Pack namens "extra" repacken
Häufige Fehler
Große Packs mit zu hoch gesetzten --depth und --window zu bauen verbraucht viel Speicher und CPU. Die Standardwerte von git gc sind für die meisten Repos sinnvoll. Dünne Packs ohne Kontext (ein bestehendes Repo, auf das sie angewendet werden) zu erzeugen ist nutzlos.
Verwandte Befehle
git unpack-objects, git verify-pack, git gc, git repack