Warum führt git bei jeder Zusammenführung “git gc –auto” aus?
Lesezeit: 7 Minuten
Mike Caron
Heute fing Git an, sich komisch zu benehmen (na ja, lustiger als sonst), indem er darauf bestand, zu rennen git gc nach jeder einzelnen Zusammenführung, auch wenn sie Rücken an Rücken sind.
C:\Projects\my-current-project>git pull
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 16 (delta 11), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From git.company.com:git/
e992ce8..6376211 mybranch/next -> origin/mybranch/next
Merge made by recursive.
Auto packing the repository for optimum performance. You may also run "git gc" manually. See "git help gc" for more information.
FIND: Parameter format not correct
Counting objects: 252732, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (59791/59791), done.
Writing objects: 100% (252732/252732), done.
Total 252732 (delta 190251), reused 252678 (delta 190222)
Removing duplicate objects: 100% (256/256), done.
.../stylesheets/style.css | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
Das ist unglaublich störend und ich befürchte, dass es bedeutet, dass mein Repository irgendwie beschädigt ist (dies ist das erste Mal, dass ich es automatisch sehe gc). Sind meine Ängste unbegründet? Wenn mein Repository in Ordnung ist, wie stoppe ich das automatische Packen?!
Automatische gc kommt vor, aber im Allgemeinen nur sehr selten.
– asmeurer
8. August 2012 um 5:04 Uhr
@asmeurer Die Frage war, ob es bei jeder Operation passiert …
– Mike Caron
13. August 2012 um 16:19 Uhr
Ich weiss. Aber Sie schienen von dieser Automatik überrascht zu sein gc überhaupt passieren würde, also wollte ich nur darauf hinweisen, dass es passiert.
– asmeurer
13. August 2012 um 21:06 Uhr
@asmeurer Ich war damals ein Git-Neuling. Meine Vermutung war, dass es einmal GC ausführt, und dann ist es fertig und muss nicht mehr gemacht werden. Jetzt weiß ich es besser (z. B. dass Git auf einem etwas anderen selbstkonsistenten Modell der Realität läuft;)
– Mike Caron
11. September 2012 um 12:43 Uhr
Vielleicht drücke ich mich nicht richtig aus. Mein Müllmann kommt jede Woche in meine Straße, er kommt nicht jedes Mal, wenn ich etwas wegwerfe. Ebenso sollte GC regelmäßig stattfinden, nicht jedes Mal, wenn ich einen Git-Befehl ausführe. Letzteres passierte, ich war verwirrt, jetzt, wenn es passierte, würde ich nur seufzen und sagen: “Oh Mist, du bist so verrückt.”
– Mike Caron
15. September 2012 um 1:50 Uhr
sehen
BEARBEITEN
Ich glaube, ich habe das Problem erkannt.
Sie führen wahrscheinlich Cygwin/git oder MsysGit unter Windows aus. Das ist mir aufgefallen, weil
FIND: Parameter format not correct
Fehlermeldung. Das Problem ist, dass irgendwo Ihre Hook-Skripte (oder git intern?!) Find aufrufen, das nicht das UNIX (GNU) Find-Dienstprogramm findet, sondern eher die Windows (MSDOS … sic) FIND.EXE.
Sie sollten in der Lage sein, Ihren systemweiten Pfad zu reparieren. Wenn dies keine Option ist, geben Sie die PATH-Umgebungsvariable explizit in Ihrem Skript an (oder bevor Sie sie aufrufen).
Alte Antwort zur Information:
git gc --auto führt nicht immer zu Maßnahmen; Sind Sie sicher, dass dies jedes Mal Zeit in Anspruch nimmt, oder haben Sie gerade bemerkt, dass es aufgerufen wird?
Wenn es jedes Mal angerufen wird, könnten Sie
Überprüfen Sie die Repository-Berechtigungen (stellen Sie sicher, dass es für Sie vollständig beschreibbar ist!)
git fsck
git umpacken
git bundle --create mybundle.git --all und git clone mybundle.git um zu sehen, ob man den Übeltäter irgendwie „erschüttern“ kann
sehen Sie, ob Sie auf eine neuere Version upgraden können
Wenn alles andere fehlschlägt, strace oder debugge die git-gc-Binärdatei
Wenn Sie den Übeltäter erschüttert haben, können Sie optional analysieren, was sich zwischen Ihrem „gereinigten“ Repo und dem aktuellen unterscheidet.
Mit dieser Option [–auto], git gc prüft, ob eine Haushaltsführung erforderlich ist; wenn nicht, wird es beendet, ohne irgendeine Arbeit auszuführen. Einige Git-Befehle führen git gc –auto aus, nachdem Operationen ausgeführt wurden, die viele lose Objekte erzeugen könnten.
Eine Haushaltsführung ist erforderlich, wenn sich zu viele lose Gegenstände oder zu viele Packungen im Aufbewahrungsort befinden. Wenn die Anzahl der losen Objekte den Wert der Konfigurationsvariablen gc.auto überschreitet, werden alle losen Objekte mit git repack -d -l zu einem einzigen Paket zusammengefasst. Wenn Sie den Wert von gc.auto auf 0 setzen, wird das automatische Packen von losen Objekten deaktiviert.
Wenn die Anzahl der Packs den Wert von gc.autopacklimit überschreitet, werden vorhandene Packs (außer denen, die mit einer .keep-Datei gekennzeichnet sind) zu einem einzelnen Pack konsolidiert, indem die Option -A von git repack verwendet wird. Das Setzen von gc.autopacklimit auf 0 deaktiviert die automatische Konsolidierung von Paketen.
Ich führe keine Hook-Skripte aus (die mir bekannt sind!), also muss es intern git sein. Der FIND-Fehler wurde durch Ändern meines PATH behoben, aber ich führe ein Handbuch aus git gc um zu sehen, ob es dadurch behoben wird.
– Mike Caron
13. September 2011 um 12:58 Uhr
Scheint das voll git gc behoben. Ich vermute, dass etwas passiert ist, das eine ganze Menge Müll in meinem Repository verursacht hat und es weit über die Schwelle “needs gc” und sogar die Schwelle “wie viel in einem Auto-GC zu tun” geschoben hat. Was dieses Ereignis war, kann ich nur vermuten (da 6 Leute regelmäßig an dieses Repo schreiben), aber es ist jetzt gestoppt, damit ich tatsächlich arbeiten kann. Ich werde diese Antwort basierend auf akzeptieren FIND Vorschlag und ließ mich darüber nachdenken, eine vollständige GC auszuführen.
– Mike Caron
13. September 2011 um 14:02 Uhr
Ich denke, eine andere Ursache könnte eine bizarre Operation (vielleicht ein Pre- oder Post-Commit-Hook) sein, die Tausende von losen Objekten erzeugt. Nur fürs Protokoll, falls noch jemand dieses Problem hat.
– asmeurer
8. August 2012 um 5:05 Uhr
Dave Schweisguth
Ich füge diese Antwort hinzu, obwohl sie das spezifische Problem des ursprünglichen Posters nicht beantwortet, da ich jedes Mal, wenn eines meiner Repos nach jeder Zusammenführung mit dem automatischen Packen beginnt, die Korrektur vergessen habe, erneut danach suchen und zuerst diese Frage finden.
Wenn eines meiner Repos nach jeder Zusammenführung “Automatisches Packen des Repositorys für optimale Leistung” startet,
git gc --prune=now
behebt es. (Auf einem Mac habe ich das nicht FIND: Parameter format not correct Problem.) Im Moment verwende ich git 2.4.1, aber das hat bei mir für mehrere 2. * -Versionen funktioniert.
Diese Antwort auf So entfernen Sie nicht referenzierte Blobs aus meinem Git-Repo legt nahe, dass Sie möglicherweise Ihr Reflog mit löschen müssen
git reflog expire --expire-unreachable=now --all
damit der obige Befehl maximal effektiv ist, aber ich musste das nie tun, um das automatische Packen nach jeder Zusammenführung zu beheben.
Welche Git-Version verwendest du? Unabhängig davon finde ich automatisch gcextrem störend.
git config --global gc.auto 0
Das ist keine gute Idee. Dies geschieht automatisch, da niemand daran denken wird, es manuell auszuführen, was zu einer Verringerung der Geschwindigkeit von git im Laufe der Zeit im Repo und einer erhöhten Dateisystemnutzung führt. Es passiert unter normalen Umständen ziemlich selten, also sollte es nicht so störend sein. Wenn es passiert, während Sie etwas anderes tun, öffnen Sie einfach einen neuen Tab in Ihrem Terminal und fahren Sie von dort aus fort.
– asmeurer
13. August 2012 um 21:09 Uhr
@asmeurer Ich stimme Stefan in diesem Punkt zu … crontab -e mit git gc –aggressive und Sie müssen nicht mehr daran denken, es manuell auszuführen, und können es außerhalb der Geschäftszeiten ausführen lassen, sodass Sie sich keine Sorgen machen müssen, getroffen zu werden damit zu zufälligen Zeiten.
– Hazok
18. Oktober 2012 um 13:06 Uhr
Sicher, es ist in Ordnung, solange Sie es manuell ausführen, was in der Antwort nie vorgeschlagen wurde.
– asmeurer
18. Oktober 2012 um 17:33 Uhr
Die richtige Lösung, um die Unterbrechung zu vermeiden, besteht darin, Auto-GC nicht zu deaktivieren (aus den oben von anderen genannten Gründen). Erstellen Sie stattdessen einen Pre-Auto-GC-Hook mit diesem Inhalt: echo "Git thinks it's time to run git gc."; exit 1 Auf diese Weise erhalten Sie rechtzeitig Erinnerungen und führen git gc nur zu einem für Sie passenden Zeitpunkt aus, anstatt zufällig.
– Laszlok
21. Juli 2017 um 12:56 Uhr
+1, da es mir weniger wichtig ist, warum es plötzlich entschieden wird, jedes Mal zu laufen, als dass es mich nicht stört, womit ich weitermachen möchte. Vorerst kann es deaktiviert werden. Leistung ist ein kleiner Preis, der für das Fehlen von Strömungsunterbrechungen zu zahlen ist.
– RJFalconer
6. März 2020 um 21:34 Uhr
Ihr Repository sollte viele Objekte haben, deren Hashes mit 17 beginnen. Dies löst also git gc –auto aus. Standard ist mindestens 28 Objekte mit dem Präfix 17.
10957700cookie-checkWarum führt git bei jeder Zusammenführung “git gc –auto” aus?yes
Automatische gc kommt vor, aber im Allgemeinen nur sehr selten.
– asmeurer
8. August 2012 um 5:04 Uhr
@asmeurer Die Frage war, ob es bei jeder Operation passiert …
– Mike Caron
13. August 2012 um 16:19 Uhr
Ich weiss. Aber Sie schienen von dieser Automatik überrascht zu sein
gc
überhaupt passieren würde, also wollte ich nur darauf hinweisen, dass es passiert.– asmeurer
13. August 2012 um 21:06 Uhr
@asmeurer Ich war damals ein Git-Neuling. Meine Vermutung war, dass es einmal GC ausführt, und dann ist es fertig und muss nicht mehr gemacht werden. Jetzt weiß ich es besser (z. B. dass Git auf einem etwas anderen selbstkonsistenten Modell der Realität läuft;)
– Mike Caron
11. September 2012 um 12:43 Uhr
Vielleicht drücke ich mich nicht richtig aus. Mein Müllmann kommt jede Woche in meine Straße, er kommt nicht jedes Mal, wenn ich etwas wegwerfe. Ebenso sollte GC regelmäßig stattfinden, nicht jedes Mal, wenn ich einen Git-Befehl ausführe. Letzteres passierte, ich war verwirrt, jetzt, wenn es passierte, würde ich nur seufzen und sagen: “Oh Mist, du bist so verrückt.”
– Mike Caron
15. September 2012 um 1:50 Uhr