Come saltare il popup "Oggetto sciolto" durante l'esecuzione di "git gui"


123

Quando eseguo "git gui" viene visualizzato un popup che dice

Questo repository contiene attualmente circa 1500 oggetti sciolti.

Quindi suggerisce di comprimere il database. L'ho già fatto e riduce gli oggetti sciolti a circa 250, ma ciò non sopprime il popup. La compressione di nuovo non cambia il numero di oggetti sciolti.

Il nostro flusso di lavoro attuale richiede un uso significativo di "rebase" mentre stiamo passando da Perforce, e Perforce è ancora il canonico SCM. Una volta che Git è l'SCM canonico, faremo unioni regolari e il problema degli oggetti sciolti dovrebbe essere notevolmente mitigato.

Nel frattempo, mi piacerebbe davvero che questo popup "utile" sparisse.


1
Quella finestra di dialogo è un ottimo esempio di una "caratteristica" che molte persone vorrebbero non esistesse. Non è solo fastidioso, può cancellare importanti commit che si sono staccati dopo un hard reset.
adelriosantiago

Risposte:


169

Poiché nessuno aveva ancora una risposta, ho esaminato il codice per vedere come rimuovere il codice che mostra quella finestra di dialogo. Ho trovato la hint_gcprocedura che lo fa e il luogo in cui viene chiamato. Allo stesso tempo ho notato che alla fine del 2011 è stata aggiunta un'opzione di configurazione per disabilitare la finestra di dialogo . Questo cambiamento (parte di git-gui 0.16.0) è stata fusa per mainline di Git su 2011-12-14 .

Quindi, se usi Git v1.7.9 o più recente, puoi disabilitare la finestra di dialogo di avviso con il seguente comando:

git config --global gui.gcwarning false

Se stai utilizzando una versione precedente, puoi modificare /lib/git-core/git-guie rimuovere la after 1000 hint_gcriga oppure modificare /usr/share/git-gui/lib/database.tcle rimuovere il corpo della hint_gcprocedura. (Questi percorsi di file si trovano su Cygwin - su altri ambienti i file potrebbero trovarsi in posizioni diverse. Per Windows lo è c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)


3
Possiamo aumentare in after 1000 hint_gcmodo che l'avviso venga visualizzato dopo 10000oggetti sciolti?
sashoalm

@sashoalm sono d'accordo. È lì per una ragione.
HankCa

Chiedendomi quali siano esattamente le buone ragioni, quel dialogo è un tale dolore, senza buone ragioni spiegate chiaramente, sono certamente molto tentato di battere solo nel comando di cui sopra.
Josh Mc

2
@sashoalm: Forse questo è ciò che intendi, ma il "1000" di si after 1000riferisce al numero di millisecondi di attesa prima che venga mostrata la finestra di dialogo. Aumentandola a "10000", la finestra di dialogo verrà comunque visualizzata, ma saranno necessari 10 secondi per farlo.
fuglede

1
Tuttavia, come menzionato nella risposta di @ NickDandoulakis, database.tclcontiene la definizione del limite e può essere aumentata per rendere il dialogo meno frequente.
fuglede

50

Aggiornamento: git prune"risolverebbe" il problema, in quanto rimuoverà quegli oggetti sciolti
( git gcchiamate git prune, ma solo per oggetti sciolti più vecchi di due settimane, per impostazione predefinita).
Tuttavia, come menziona l' OP Michael Donohue nei commenti:

Mi piace l'aspetto della sicurezza di mantenere gli oggetti sciolti in giro per due settimane, se voglio tornare indietro e guardare alcune vecchie revisioni, quindi non mi piace molto questa soluzione.
Non ho problemi con le dimensioni o le prestazioni di git, è solo "git gui" che insiste nel chiedermi di comprimere il database, anche quando la compressione del database non avrebbe alcun effetto.


Risposta originale:

Il problema della " git gc" non rimozione di tutti gli oggetti sciolti è stato segnalato in precedenza (alla fine del 2008, " " git gc"non sembra più rimuovere gli oggetti sciolti "

git gc rimuove solo gli oggetti sciolti più vecchi di due settimane, se vuoi davvero rimuoverli ora, esegui git prune.
Ma assicurati che nessun altro processo git possa essere attivo quando lo esegui, altrimenti potrebbe calpestare qualcosa.

" git gc" decomprimerà gli oggetti che sono diventati irraggiungibili e che erano attualmente in pacchetti.
Di conseguenza, la quantità di spazio su disco utilizzata da un repository git può effettivamente aumentare drasticamente dopo un'operazione " git gc", il che potrebbe essere sorprendente per qualcuno che sta eseguendo quasi al massimo il proprio filesystem, elimina un numero di rami da un repository di tracciamento , e poi un " git gc" potrebbe ricevere una spiacevole sorpresa.

[Esempio: i ]vecchi rami sono riservati tramite un tag come next-20081204.
Se aggiorni la tua copia locale del linux-nextrepository ogni giorno, accumulerai un gran numero di questi vecchi tag di ramo.
Se poi elimini un'intera serie di loro ed eseguigit-gc , l'operazione richiederà un po 'di tempo e il numero di blocchi e inode utilizzati aumenterà in modo significativo.

Scompariranno dopo un " git prune", ma quando eseguo questa operazione di pulizia, ho spesso desiderato --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repositoryun'opzione per "git gc".

Quindi nel tuo caso, sarebbe utile un " git prune"?

(possibilmente con l'utilizzo di "now" nella gc.pruneexpirevariabile di configurazione, necessaria per il comportamento di cui sopra).


Hai anche (dallo stesso thread):

repack -a -d -l

Notare la "a" minuscola.

git-gcchiama repack con 'A' maiuscola che è ciò che causa la decompressione degli oggetti non raggiungibili. La piccola "a" è per le persone che sanno cosa stanno facendo e vogliono che git rilasci semplicemente oggetti non raggiungibili.


1
'git prune' probabilmente risolverebbe il mio problema immediato - lo proverò più tardi oggi. Tuttavia, mi piace l'aspetto della sicurezza di tenere gli oggetti sciolti in giro per due settimane, se voglio tornare indietro e guardare alcune vecchie revisioni, quindi non mi piace molto questa soluzione. Non ho problemi con le dimensioni o le prestazioni di git, è solo "git gui" che insiste nel chiedermi di comprimere il database, anche quando la compressione del database non avrebbe alcun effetto.
Michael Donohue

commento molto utile. Quel fastidioso messaggio di "oggetto sciolto" stava diventando davvero fastidioso. Comunque da dove viene quel conteggio? L'output di git-fsck, forse?
David Dombrowsky,

grazie - avevo anche oggetti sciolti che git gc non stava rimuovendo - git prune era la risposta.
shedd

Ho fatto un git prune al di fuori di qualsiasi repository e ha chiarito alcuni degli oggetti. Quindi sono entrato nel repository dei problemi e ho fatto un git prune e tutti i problemi erano spariti.
Nicholas Orlowski

"git prune" risolve il problema che OP (e io) avevamo: "L'ho già fatto e riduce gli oggetti sciolti a circa 250, ma questo non sopprime il popup."
Eike

32

Quando viene visualizzato il popup "Oggetto sciolto", so che è ora di eseguire il garbage collector di git:

git gc

Dopodiché il popup scompare.

Aggiornamento: (grazie al suggerimento di TED)

ho estratto la routine seguente da git/share/git-gui/lib/database.tcl
Puoi modificarla per soddisfare le tue esigenze.

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

1
Fare clic su OK nella finestra di dialogo non fa proprio questo? Se gc non si fosse sbarazzato di tutti gli oggetti sciolti, otterrebbe comunque la finestra di dialogo.
TED

Ho fatto clic su "OK" e ho eseguito "git gc" dalla riga di comando: entrambi mi portano a 250, ma farlo di nuovo non fa ulteriori progressi.
Michael Donohue

3
So che è strano ma pulire la base dalla gui a volte lascia oggetti liberi. Chiudo la gui, eseguo git-gc, e poi tutta la spazzatura è sparita.
Nick Dandoulakis

3
La modifica del tcl risolve il problema: ho appena aumentato il limite di finestre a 10 * 250. Grazie!
Michael Donohue

per me correre git gcdalla riga di comando ha risolto il problema ... il semplice clic oksu git gui in qualche modo non ha funzionato ...
raphael

3

Hmmmm ... Non vedo un argomento della riga di comando per questo nei documenti .

Suppongo che tu possa sempre estrarre la sua fonte, estrarre il codice per la finestra di dialogo e ricostruire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.