2009-07-09 4 views
97

Wenn ich laufen ‚git gui‘ ich ein Popup-Fenster ausgeführt wird, dieWie „Loose Objekt“ Pop-up überspringen, wenn ‚git gui‘

 
This repository currently has approximately 1500 loose objects. 

sagt Er schlägt dann die Datenbank 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 loser Objekte nicht geändert.

Unser aktueller Workflow erfordert eine erhebliche Verwendung von "Rebase", da wir von Perforce aus wechseln, und Perforce ist immer noch das kanonische SCM. Sobald Git der kanonische SCM ist, werden wir regelmäßige Zusammenführungen durchführen, und das Problem loser Objekte sollte stark gemildert werden.

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

+0

Dieser Dialog ist ein großartiges Beispiel für ein "Feature", von dem sich viele Leute wünschen, es existiere nicht . Es ist nicht nur lästig, es kann wichtige Commits löschen, die nach einem Hard-Reset gelöst wurden. – adelriosantiago

Antwort

132

Da niemand noch eine Antwort hatte, schaute ich in den Code, um zu sehen, wie man den Code entfernt, der diesen Dialog zeigt. Ich fand die hint_gc Prozedur, die es tut und der Ort, an dem es aufgerufen wird. Zur gleichen Zeit habe ich bemerkt, dass Ende 2011 a configuration option for disabling the dialog hinzugefügt wurde. Diese Änderung (Teil von git-gui 0.16.0) wurde mit der Git-Hauptlinie unter 2011-12-14 zusammengeführt.

Also, wenn Sie Git v1.7.9 oder höher verwenden, können Sie die Warnmeldung mit folgendem Befehl deaktivieren:

git config --global gui.gcwarning false 

Wenn Sie eine ältere Version verwenden, dann können Sie /lib/git-core/git-gui bearbeiten und entfernen die after 1000 hint_gc Zeile oder bearbeiten Sie und entfernen Sie den Körper der hint_gc Prozedur. (Diese Dateipfade befinden sich auf Cygwin - in anderen Umgebungen befinden sich die Dateien möglicherweise an einem anderen Ort. Für Windows ist es c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

+1

Können wir 'nach 1000 hint_gc' erhöhen, so dass die Warnung nach' 10000' losen Objekten erfolgt? – sashoalm

+0

@ashoalm Ich stimme zu. Es ist aus einem bestimmten Grund da. – HankCa

27

Wenn "Loose Object" Pop-up Ich weiß, es ist Zeit git der Garbage Collector ausgeführt wird:

git gc 

Danach wird das Popup-weggeht.

Update: (wegen T.E.D. Vorschlag)

ich von git/share/git-gui/lib/database.tcl
die unter Routine extrahiert Sie es ändern können, Ihre Bedürfnisse zu erfüllen.

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 
     } 
    } 
} 
+0

Klicken Sie nicht im Dialogfeld auf OK? Wenn gc nicht alle losen Objekte loswerden würde, würde er immer noch den Dialog führen. –

+0

Ich habe auf "OK" geklickt und ich habe 'git gc' von der Kommandozeile aus ausgeführt - beide bringen mich auf 250 runter, aber es macht keinen weiteren Fortschritt. –

+3

Ich weiß, es ist komisch, aber das Reinigen der Basis von Gui hinterlässt manchmal lose Objekte. Ich schließe die GUI, starte git-gc, und dann ist der ganze Müll weg. –

3

Hmmmm .... Ich sehe nicht ein Befehlszeilenargument für die in der docs.

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

+0

+1, wahrscheinlich ist das die einzige Lösung. –

43

Update: git prune würde „lösen“ das Problem, dass es diese losen Gegenstände
(git gc Anrufe git prune, aber nur für lose Gegenstände älter als zwei Wochen, in der Standardeinstellung) zu entfernen.
Da jedoch die OP Michael Donohue erwähnt in den Kommentaren:

Ich mag die Sicherheitsaspekte der losen Gegenstände um zwei Wochen zu halten, sollte ich zurück zu gehen und einen Blick auf einige alte Versionen, so dass ich don Ich mag diese Lösung nicht wirklich.
Ich habe keine Probleme mit der Größe oder Leistung von Git, es ist nur 'git gui', besteht darauf, mich zu bitten, die Datenbank zu komprimieren, auch wenn die Komprimierung der Datenbank keinen Effekt haben würde.


Ursprüngliche Antwort:

Das Problem der "git gc" nicht alle lose Gegenstände zu entfernen hat vor (Ende 2008 berichtet wurde, ""git gc" doesn't seem to remove loose objects any more"

git gc nur entfernt lose Objekte älter als zwei Wochen, wenn Sie sie jetzt wirklich entfernen möchten, führen Sie git Pflaume.
Aber machen Sicher, kein anderer Git Prozess kann aktiv sein, wenn Sie es ausführen, oder es könnte möglicherweise Schritt auf etwas.

"git gc" wird entpacken Objekte, die unerreichbar geworden sind und waren derzeit in Packs.
Als Ergebnis kann die Menge an Speicherplatz von einem Git-Repository tatsächlich gehen bis dramatisch nach einer "git gc" -Operation, die für jemanden, der fast auf ihrem Dateisystem läuft, überraschend sein kann, löscht eine Reihe von Zweige aus einem Tracking-Repository, und dann kann eine "git gc" eine sehr unangenehme Überraschung bekommen.

[ Beispiel: ] Alte Zweige werden über ein Tag wie next-20081204 reserviert.
Wenn Sie Ihre lokale Kopie des linux-next-Repositorys jeden Tag aktualisieren, sammeln Sie eine große Anzahl dieser alten Zweig-Tags an.
Wenn Sie dann eine ganze Reihe von ihnen löschen und git-gc ausführen, wird die Operation eine ganze Weile dauern, und die Anzahl der verwendeten Blöcke und Inodes wird deutlich zunehmen.

Sie nach einem „git prune“ verschwinden werden, aber wenn ich diesen Housekeeping Betrieb tun, ich habe für eine --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repository Option „git gc“ oft gewünscht.

Also in Ihrem Fall wäre ein "git prune" hilfreich?

(möglicherweise mit der Verwendung von "jetzt" in der gc.pruneexpire Konfigurationsvariable, die für das obige Verhalten erforderlich ist).


Sie haben auch (aus dem gleichen Thread):

repack -a -d -l 

Beachten Sie die kleinen 'a'.

git-gc ruft das Umpacken mit Großbuchstaben 'A' auf, was dazu führt, dass die nicht erreichbaren Objekte ausgepackt werden. Little 'a', ist für Leute, die wissen, was sie tun, und möchten, dass git einfach unerreichbare Objekte fallen lässt.

+1

'Git Prune' würde wahrscheinlich mein unmittelbares Problem lösen - ich werde es später später versuchen. Ich mag jedoch den Sicherheitsaspekt, die losen Objekte für zwei Wochen herumzubehalten, sollte ich zurückgehen und einige alte Revisionen ansehen wollen, so dass ich diese Lösung nicht wirklich mag. 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 keinen Effekt hätte. –

+0

sehr hilfreicher Kommentar. Diese lästige "lose Objekt" Nachricht wurde wirklich nervig. Woher kommt das überhaupt? Die Ausgabe von git-fsck, vielleicht? –

+0

danke - ich hatte auch lose Objekte, die git gc nicht entfernen wollte - git prune war die Antwort. – shedd

Verwandte Themen