Warum führt git bei jeder Zusammenführung “git gc –auto” aus?

Lesezeit: 7 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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.

Aus die Git-GC-Manpage:

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

Benutzer-Avatar
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.

1095770cookie-checkWarum führt git bei jeder Zusammenführung “git gc –auto” aus?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy