So überspringen Sie das Popup "Loose Object", wenn Sie "git gui" ausführen.

123

Wenn ich 'git gui' starte, wird ein Popup mit der Aufschrift angezeigt

Dieses Repository enthält derzeit ungefähr 1500 lose Objekte.

Anschließend wird vorgeschlagen, die Datenbank zu komprimieren. Ich habe das schon einmal gemacht und es reduziert die losen Objekte auf ungefähr 250, aber das unterdrückt das Popup nicht. Durch erneutes Komprimieren wird die Anzahl der losen Objekte nicht geändert.

Unser aktueller Workflow erfordert eine erhebliche Verwendung von "Rebase", wenn wir von Perforce wechseln, und Perforce ist immer noch das kanonische SCM. Sobald Git das kanonische SCM ist, werden wir regelmäßige Zusammenführungen durchführen, und das Problem mit losen Objekten sollte stark gemindert werden.

In der Zwischenzeit möchte ich dieses "hilfreiche" Popup wirklich verschwinden lassen.

Michael Donohue
quelle
1
Dieser Dialog ist ein großartiges Beispiel für eine "Funktion", von der sich viele wünschen würden, dass sie nicht existiert. Es ist nicht nur ärgerlich, es kann auch wichtige Commits löschen, die sich nach einem Hard-Reset gelöst haben.
Adelriosantiago

Antworten:

169

Da noch niemand eine Antwort hatte, habe ich in den Code geschaut, um zu sehen, wie der Code entfernt werden kann, der diesen Dialog anzeigt. Ich habe die hint_gcProzedur gefunden , die es macht, und den Ort, an dem es aufgerufen wird. Gleichzeitig bemerkte ich, dass Ende 2011 eine Konfigurationsoption zum Deaktivieren des Dialogs hinzugefügt wurde . Diese Änderung (Teil von git-gui 0.16.0) wurde am 14.12.2011 mit der Hauptlinie von Git zusammengeführt .

Wenn Sie also Git v1.7.9 oder höher verwenden, können Sie den Warndialog mit dem folgenden Befehl deaktivieren:

git config --global gui.gcwarning false

Wenn Sie eine ältere Version verwenden, können Sie /lib/git-core/git-guidie after 1000 hint_gcZeile bearbeiten /usr/share/git-gui/lib/database.tclund entfernen oder den Hauptteil der hint_gcProzedur bearbeiten und entfernen . (Diese Dateipfade befinden sich in Cygwin. In anderen Umgebungen befinden sich die Dateien möglicherweise an einem anderen Speicherort. Für Windows ist dies der Fall. c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

Esko Luontola
quelle
3
Können wir erhöhen, after 1000 hint_gcdamit die Warnung nach 10000losen Gegenständen auftritt?
Sashoalm
@sashoalm Ich stimme zu. Es ist aus einem bestimmten Grund da.
HankCa
Wenn ich mich frage, was genau die guten Gründe sind, dass der Dialog so ein Schmerz ist, ohne gute Gründe, die klar erklärt wurden, bin ich sicherlich sehr versucht, nur den obigen Befehl einzugeben.
Josh Mc
2
@sashoalm: Vielleicht ist es das, was Sie meinen, aber die "1000" von after 1000bezieht sich auf die Anzahl der Millisekunden, die gewartet werden muss, bis der Dialog angezeigt wird. Wenn Sie den Wert auf "10000" erhöhen, wird der Dialog weiterhin angezeigt. Es dauert jedoch 10 Sekunden, bis er ausgeführt wird.
Fuglede
1
Wie in der Antwort von @ NickDandoulakis erwähnt, database.tclenthält es jedoch die Definition des Grenzwerts und kann erhöht werden, um den Dialog weniger häufig zu gestalten.
Fuglede
50

Update: git prunewürde das Problem "lösen", indem diese losen Objekte entfernt werden
( git gcAufrufe git prune, standardmäßig jedoch nur für lose Objekte, die älter als zwei Wochen sind).
Wie das OP Michael Donohue jedoch in den Kommentaren erwähnt:

Ich mag den Sicherheitsaspekt, die losen Gegenstände zwei Wochen lang aufzubewahren, sollte ich zurückgehen und mir einige alte Revisionen ansehen wollen, also mag ich diese Lösung nicht wirklich.
Ich habe keine Probleme mit der Größe oder Leistung von Git. Es ist nur "Git Gui", das darauf besteht, mich zu bitten, die Datenbank zu komprimieren, selbst wenn das Komprimieren der Datenbank keine Auswirkungen hätte.


Ursprüngliche Antwort:

Das Problem der „ git gc“ nicht entfernen Sie alle losen Gegenstände hat vor (Ende 2008 berichtet wurde, „ git gc„scheint nicht lose zu entfernen Objekte mehr

git gcEntfernt nur lose Objekte, die älter als zwei Wochen sind. Wenn Sie sie jetzt wirklich entfernen möchten, führen Sie git prune aus.
Stellen Sie jedoch sicher, dass kein anderer Git-Prozess aktiv sein kann, wenn Sie ihn ausführen, oder dass er möglicherweise auf etwas tritt.

" git gc" entpackt Objekte, die nicht mehr erreichbar sind und sich derzeit in Paketen befinden.
Als Folge Raum die Menge der Platte von einem Git Repository verwendet tatsächlich gehen kann , bis dramatisch nach einer „ git gc“ Operation, die für jemanden überraschen könnte , die auf ihrem Dateisystem nahezu vollständig ausgeführt wird , löscht eine Reihe von Niederlassungen von einer Tracking - Repository und dann macht ein " git gc" eine sehr unangenehme Überraschung.

[Beispiel: ]Alte Zweige werden über ein Tag wie reserviert next-20081204.
Wenn Sie Ihre lokale Kopie des linux-nextRepositorys jeden Tag aktualisieren , sammeln Sie eine große Anzahl dieser alten Zweigstellen-Tags.
Wenn Sie dann eine ganze Reihe von ihnen löschen und ausführen git-gc, dauert der Vorgang eine Weile, und die Anzahl der verwendeten Blöcke und Inodes nimmt erheblich zu.

Sie verschwinden nach einem " git prune", aber wenn ich diesen Reinigungsvorgang durchführe, habe ich mir oft eine --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repositoryOption für "git gc" gewünscht.

Wäre in Ihrem Fall ein " git prune" hilfreich?

(Möglicherweise mit "jetzt" in der gc.pruneexpireKonfigurationsvariablen, die für das obige Verhalten erforderlich ist).


Sie haben auch (aus dem gleichen Thread):

repack -a -d -l

Beachten Sie den Kleinbuchstaben 'a'.

git-gcruft das Umpacken mit Großbuchstaben 'A' auf, wodurch die nicht erreichbaren Objekte entpackt werden. Little 'a' ist für Leute, die wissen, was sie tun und wollen, dass Git einfach nicht erreichbare Objekte fallen lässt.

VonC
quelle
1
'git prune' würde wahrscheinlich mein unmittelbares Problem lösen - ich werde es später heute versuchen. Ich mag jedoch den Sicherheitsaspekt, die losen Gegenstände zwei Wochen lang aufzubewahren, sollte ich zurückgehen und mir einige alte Revisionen ansehen wollen, daher mag ich diese Lösung nicht wirklich. Ich habe keine Probleme mit der Größe oder Leistung von Git. Es ist nur "Git Gui", das darauf besteht, mich zu bitten, die Datenbank zu komprimieren, selbst wenn das Komprimieren der Datenbank keine Auswirkungen hätte.
Michael Donohue
sehr hilfreicher Kommentar. Diese nervige "lose Objekt" -Nachricht wurde wirklich nervig. Woher kommt diese Zählung überhaupt? Die Ausgabe von git-fsck vielleicht?
David Dombrowsky
danke - ich hatte auch lose gegenstände, die git gc nicht entfernte - git prune war die antwort.
Shedd
Ich habe einen Git-Schnitt außerhalb eines Repositorys durchgeführt und einige der Objekte wurden gelöscht. Dann ging ich in das Problem-Repository und machte einen Git-Prune und alle Probleme waren weg.
Nicholas Orlowski
"git prune" löst das Problem, das OP (und ich) hatten: "Ich habe das schon einmal gemacht und es reduziert die losen Objekte auf ungefähr 250, aber das unterdrückt das Popup nicht."
Eike
32

Beim Popup "Loose Object" weiß ich, dass es Zeit ist, den Garbage Collector von git auszuführen:

git gc

Danach verschwindet das Popup.

Update: (aufgrund des Vorschlags von TED)

Ich habe die folgende Routine aus extrahiert. git/share/git-gui/lib/database.tcl
Sie können sie an Ihre Bedürfnisse anpassen.

proc hint_gc {} {
    set object_limit 8
    if {[is_Windows]} {
        set object_limit 1
    }

    set objects_current [llength [glob \
        -directory [gitdir objects 42] \
        -nocomplain \
        -tails \
        -- \
        *]]

    if {$objects_current >= $object_limit} {
        set objects_current [expr {$objects_current * 256}]
        set object_limit    [expr {$object_limit    * 256}]
        if {[ask_popup \
            [mc "This repository currently has approximately %i loose objects.

To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist.

Compress the database now?" $objects_current $object_limit]] eq yes} {
            do_gc
        }
    }
}
Nick Dandoulakis
quelle
1
Funktioniert das Klicken im Dialog nicht genau das? Wenn gc nicht alle losen Gegenstände loswerden würde, würde er immer noch den Dialog bekommen.
TED
Ich habe auf "OK" geklickt und "git gc" über die Befehlszeile ausgeführt. Beide bringen mich auf 250, aber ein erneutes Ausführen bringt keine weiteren Fortschritte.
Michael Donohue
3
Ich weiß, dass es seltsam ist, aber das Reinigen der Basis von GUI hinterlässt manchmal lose Gegenstände. Ich schließe die GUI, starte git-gc und dann ist der ganze Müll weg.
Nick Dandoulakis
3
Das Ändern des tcl behebt das Problem - ich habe gerade das Windows-Limit auf 10 * 250 erhöht. Danke!
Michael Donohue
Für mich hat das Laufen git gcvon der Kommandozeile das Problem gelöst ... nur auf okgit gui zu klicken hat irgendwie nicht den Trick gemacht ...
raphael
3

Hmmmm .... Ich sehe kein Befehlszeilenargument dafür in den Dokumenten .

Ich nehme an, Sie könnten jederzeit die Quelle abrufen, den Code für den Dialog herausnehmen und neu erstellen.

TED
quelle