Was bedeutet "Automatisches Packen des Repositorys für optimale Leistung"?

225

Ich habe ein Problem mit meinem Git Repo. In den letzten Tagen wird bei jedem Push an den Server die folgende Meldung angezeigt: "Automatisches Packen des Repositorys für optimale Leistung", und es scheint nicht zu verschwinden und die Shell zurückzugeben.

Ich habe auch versucht, in einen neuen Zweig auszuchecken und dann einen Rebase für meinen vorherigen Zweig durchzuführen. Dann habe ich git gcdie nicht verwendeten Verlaufsobjekte entfernt und dann einen Push ausgeführt, aber diese Meldung wird weiterhin angezeigt. Bitte lassen Sie mich wissen, was mit meinem Repo los ist.

Furqan Asghar
quelle

Antworten:

304

Kurzfassung: Es bedeutet, was es sagt, und wenn Sie es einfach beenden lassen, wird alles gut.

Während der meisten Vorgänge, die möglicherweise die Anzahl der losen (entpackten) Objekte im Repository erhöhen können (einschließlich Pushs), wird Git aufgerufen git gc --auto. Wenn genügend lose Objekte vorhanden sind (standardmäßig mindestens 6700), wird das git repack -d -lPacken aufgerufen. Wenn zu viele separate Packungen vorhanden sind, werden diese auch in eine Packung umgepackt.

Ein Pack ist eine Delta-komprimierte Einzeldatei, die eine große Anzahl von Objekten enthält. Das Speichern von Objekten in Paketen ist effizienter, das Packen (Komprimieren) von Objekten dauert jedoch einige Zeit. Daher erstellt Git zunächst lose Objekte und packt sie dann ab und zu in Stapeln über den automatischen Aufruf von git gc --auto.

Wenn Sie Git das Umpacken beenden lassen, wird dies für eine Weile nicht mehr vorkommen. Es kann in der Tat eine Weile dauern, insbesondere wenn Sie viele große binäre Objekte haben, aber wenn es ausgelöst wird, ist dies ein Zeichen dafür, dass es wahrscheinlich den vom Repo belegten Speicherplatz drastisch reduzieren wird. Wenn Sie dies wirklich nicht möchten, können Sie den Konfigurationsparameter ändern gc.auto. Wenn Sie den Wert auf etwas viel Größeres als 6700 erhöhen, tritt er seltener auf, dauert jedoch länger. Wenn Sie es verringern, muss es immer noch Ihr aktuelles Umpacken durchführen, aber anschließend passiert es häufiger und endet schneller. Wenn Sie den Wert auf 0 setzen, wird das automatische Umpacken deaktiviert.

Siehe man git-gc(unter --auto) und man git-config(unter gc.auto) für weitere Informationen.

Cascabel
quelle
14
In der Tat dauerte dies ungefähr 5 Minuten für mich, aber es endete. Gute Antwort.
Joshua Pinter
6
Wir sehen es bei jedem Stoß (eine Weile ein paar Sekunden, heh).
2
@dpk: Das sollte unter normalen Umständen nicht passieren - die Anzahl der Objekte in einem einzelnen Push sollte nicht groß genug sein, um ihn auszulösen (es sei denn, Ihr Repository ist riesig und / oder Sie pushen eine Menge Commits), also einmal erfolgreich abgeschlossen (Sie lassen es vervollständigen, oder?), sollte es nicht wieder vorkommen, bis Sie es aufgebaut haben. Wenn Sie es nicht herausfinden können, stellen Sie eine separate Frage.
Cascabel
6
"Wenn du Git fertig machen lässt", und es kann ... fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack- das bekomme ich, wenn ich unsere gesamte Codebasis in ein Git-Repo stecke. Ich denke , ich werde töten apps und Kraft umpacken „manuell“
ruffin
11
Ich bekomme es jedes Mal, wenn ich einen Git Pull mache. Ich habe ein manuelles Git GC gemacht, aber es passiert immer noch jedes Mal, wenn ich ziehe. Seltsam.
Barry Kelly
51

Während Jefroni richtig ist, dass das automatische Packen manchmal nur Zeit benötigt, um fertig zu sein, besteht eine gute Chance, dass bei der Bereinigung von git baumelnde Objekte fehlen, wie in dieser Frage beschrieben .

Versuchen Sie auszuführen, um festzustellen, ob baumelnde Objekte fortlaufende Meldungen zum automatischen Packen auslösen git fsck. Wenn Sie eine lange Liste von baumelnden Commits erhalten, können Sie diese mit bereinigen

git gc --prune=now

Normalerweise muss ich dies alle 2-3 Monate auf meinem Repo ausführen, wenn die Nachricht zum automatischen Packen nach einem einzigen Zug nicht verschwindet.

wbharding
quelle
5
Dies war zwar nicht die akzeptierte Antwort, aber genau das, was ich brauchte. Ich bekam die Nachricht jedes Mal, wenn ich git pullüber mehrere Tage hinweg eine Nachricht machte , und fsckzeigte tatsächlich eine Menge baumelnder Commits.
Jörn Zaefferer
36

So deaktivieren Sie für ein Projekt:

cd your_project_dir
git config gc.auto 0

So deaktivieren Sie global:

git config --global gc.auto 0
Anders Lindén
quelle
2
Ich glaube, ich habe herausgefunden, wie: Gehe in den Ordner .git, öffne die Konfigurationsdatei, lösche den Text 'auto = 0' und speichere. Das scheint das Autopacking wieder zu aktivieren.
Adrian Keister
18
git config --unset gc.auto
jtatum
10

Git führt git-repack aus, das viele Objekte (= Dateien, Commits und Bäume) in eine Packdatei packt. Git tut dies manchmal, wenn eine Heuristik besagt, dass Speicherplatz gespeichert werden kann (eine Packdatei enthält komprimierte Objektdeltas, während jede Datei im Objektverzeichnis den komprimierten vollständigen Dateiinhalt enthält).

Rudi
quelle
2

Hoffentlich ist dieser git gc --autoSchritt jetzt (Git 2.0.1, 25. Juni 2014) effizienter.
Siehe Commit 62aad18 von Nguyễn Thái Ngọc Duy ( pclouds)

gc --auto: Refs nicht im Hintergrund sperren

9f673f9 ( gc: Konfigurationsoption zum Ausführen von --auto im Hintergrund - 08.02.2014, Git 2.0.0) setzt " gc --auto" in den Hintergrund, um die Wartezeit des Benutzers zu verringern.
Ein Teil der Müllabfuhr sind Pack-Refs und das Beschneiden von Reflogs. Diese erfordern das Sperren einiger Refs und können andere Prozesse abbrechen, die versuchen, denselben Ref zu sperren.

Wenn gc --autoes mitten in einem Skript ausgelöst wird, kann das Halten von Sperren von gc im Hintergrund das Skript zum Scheitern bringen, was vor 9f673f9 niemals passieren kann .

Laufen Sie weiter pack-refsund " reflog --prune" im Vordergrund, um parallele Ref-Updates zu stoppen. Die verbleibenden Hintergrundoperationen (Umpacken, Bereinigen und erneutes Laden) sollten sich nicht auf laufende Git-Prozesse auswirken.

Und Git 2.22 (Q2 2019) weiter optimierengit gc .

VonC
quelle