2009-07-09 8 views
97

Quando eseguo 'git gui' ho un popup che diceCome saltare popup "Loose oggetto" durante l'esecuzione di 'git gui'

 
This repository currently has approximately 1500 loose objects. 

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

Il flusso di lavoro corrente richiede un uso significativo di "rebase" mentre stiamo passando da Perforce e Perforce è ancora lo SCM canonico. Una volta che Git è l'SCM canonico, faremo fusioni regolari e il problema degli oggetti mobili dovrebbe essere fortemente mitigato.

Nel frattempo, mi piacerebbe davvero far scomparire questo popup "utile".

+0

Quella finestra di dialogo è un ottimo esempio di una "funzione" che molte persone vorrebbero che non esistesse . Non è solo fastidioso, può cancellare importanti commit che sono stati rimossi dopo un hard reset. – adelriosantiago

risposta

132

Dal momento che nessuno aveva ancora una risposta, ho esaminato il codice per vedere come rimuovere il codice che mostra quel dialogo. Ho trovato la procedura hint_gc che lo fa e il luogo in cui è chiamato. Allo stesso tempo ho notato che alla fine del 2011 è stato aggiunto a configuration option for disabling the dialog. Questo cambiamento (parte di git-gui 0.16.0) è stato unito alla linea principale di Git su 2011-12-14.

Quindi, se si utilizza Git v1.7.9 o più recente, è possibile disattivare la finestra di avviso con il seguente comando:

git config --global gui.gcwarning false 

Se si utilizza una versione precedente, quindi è possibile modificare e rimuovere /lib/git-core/git-gui la riga after 1000 hint_gc o modificare /usr/share/git-gui/lib/database.tcl e rimuovere il corpo della procedura hint_gc. (Questi percorsi di file sono su Cygwin - su altri ambienti i file potrebbero essere in posizioni diverse. Per Windows è c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

+1

Possiamo aumentare 'dopo 1000 hint_gc', quindi l'avviso si verifica dopo che gli oggetti" 10000 "sono allentati? – sashoalm

+0

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

27

Quando "Loose oggetto" pop-up So che è il momento di eseguire garbage collector di git:

git gc 

Dopo che il popup va via.

Aggiornamento: (a causa di suggerimento di T.E.D.)

ho estratto la routine sotto da git/share/git-gui/lib/database.tcl
È possibile modificarlo per soddisfare le vostre 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 
     } 
    } 
} 
+0

Non fa clic su OK nella finestra di dialogo proprio? Se gc non si liberasse di tutti gli oggetti liberi, avrebbe comunque ottenuto il dialogo. –

+0

Ho cliccato su "OK" e ho eseguito "git gc" dalla riga di comando - entrambi mi fanno scendere a 250, ma farlo di nuovo non fa ulteriori progressi. –

+3

So che è strano ma pulire la base dal gui a volte lascia oggetti liberi. Chiudo la GUI, eseguo git-gc, e poi tutti i rifiuti sono spariti. –

3

Hmmmm .... non vedo un argomento della riga di comando per che nel docs.

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

+0

+1, probabilmente questa è l'unica soluzione. –

43

Aggiornamento: git prune sarebbe "risolvere" il problema, nel senso che rimuoverà quegli oggetti sciolti
(git gc chiamate git prune, ma solo per gli oggetti sciolti più vecchi di due settimane, per impostazione predefinita).
Tuttavia, come la OP Michael Donohue menzioni nei commenti:

mi piace l'aspetto della sicurezza di tenere gli oggetti liberi in giro per due settimane, dovrei desiderare di tornare indietro e guardare alcune vecchie revisioni, così ho don Mi piace molto questa soluzione.
Non ho alcun problema con le dimensioni o le prestazioni di git, è solo 'git gui' che insiste nel chiedermi di comprimere il database, anche se la compressione del database non avrebbe alcun effetto.


risposta originale:

Il problema della "git gc" non rimuovendo tutti oggetti liberi stato segnalato prima (fine del 2008, ""git gc" doesn't seem to remove loose objects any more"

git gc rimuove solo sciolto oggetti più vecchi di due settimane, se davvero vuoi rimuoverli adesso, esegui git prune
Ma fai certo nessun altro processo git può essere attivo quando lo si esegue, o potrebbe eventualmente fare un passo su su qualcosa.

"git gc" sarà decomprimere oggetti che sono diventati irraggiungibili ed erano attualmente in pacchetti.
Come risultato, la quantità di spazio su disco utilizzata da un repository git può effettivamente andare su in modo drammatico dopo un'operazione "git gc", che potrebbe essere sorprendente per qualcuno che sta correndo vicino al suo filesystem, elimina un numero di rami da un repository di tracciamento, e quindi fa un "git gc" può ottenere una sorpresa molto spiacevole.

[ Esempio: ] I vecchi rami sono riservati tramite un tag come next-20081204.
Se si aggiorna la copia locale del repository linux-next ogni giorno, si accumulerà un gran numero di questi vecchi tag di ramo.
Se si elimina una serie intera di esse ed è in esecuzione git-gc, l'operazione richiederà un po 'di tempo e il numero di blocchi e di inode utilizzati aumenterà in modo significativo.

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

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

(possibilmente con l'utilizzo di "now" nella variabile di configurazione gc.pruneexpire, necessario per il comportamento sopra riportato).


Hai anche (dallo stesso filo):

repack -a -d -l 

Avviso la minuscola 'a'.

git-gc chiama repack con maiuscolo 'A', che è ciò che causa lo spacchettamento degli oggetti non raggiungibili. Little 'a', è per le persone che sanno quello che stanno facendo e vogliono che git tocchi solo oggetti irraggiungibili.

+1

"git prune" probabilmente risolverebbe il mio problema immediato - ci proverò più tardi oggi. Tuttavia, mi piace l'aspetto della sicurezza di tenere gli oggetti liberi in giro per due settimane, se voglio tornare indietro e vedere alcune vecchie revisioni, quindi non mi piace molto questa soluzione. Non ho alcun problema 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. –

+0

commento molto utile. Quel fastidioso messaggio "oggetto libero" stava diventando davvero fastidioso. Da dove viene il conto? L'output di git-fsck, forse? –

+0

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

Problemi correlati