2011-11-28 17 views
7

Dopo aver utilizzato git gc e git repack (con varie opzioni) Ho ancora 4825 sciolto impegna nella cartella .git/objects. Vorrei aggiungere a nel file pack con il resto o in un altro file pack.Git: come reimballano tutti i commit sciolto

Sto eseguendo un sacco di riscrittura del commit (modifica + rebase), quindi è perfettamente normale avere molti commit non raggiungibili. Il mio .gitconfig contiene questi parametri per mantenere a lungo i reflog e le commit non raggiungibili.

[gc] 
    reflogExpire = 300 days 
    reflogExpireUnreachable = 200 days 
    pruneExpire = 90 days 

Vi chiederete se ha senso ma ho già necessario e hanno recuperato un paio di commit fatti diversi mesi fa. Succede che sviluppiamo per molti mesi su una nuova serie di rami con priorità più alta e successivamente continuiamo sui rami meno prioritari più vecchi.

Il motivo principale di questa domanda è che git gui continua a lamentarsi per comprimere i miei dati del database che ho fatto molte volte. Se non siamo in grado di impacchettare quei commit indifferenti, questo "lamentarsi" potrebbe essere un bug in git gui.

+0

wow, non avevo idea che le persone possano effettivamente lavorare con quel gran numero di commit – prusswan

+0

dupe/related? http://stackoverflow.com/questions/3765234/listing-and-deleting-git-commits-that-are-under-no-branch-dangling – cregox

risposta

1

Considerando che git bundle viene utilizzato per lavorare solo con oggetti di imballaggio (chiamando fetch-pack), hai provato to bundle e poi clonare il repository?

git bundle create aBundle --all # hopefully package everything, 
           # the result being *one* file. 
git clone aBundle newRepo  # recreate a full repo 
# check if the cloned repo contains only packaged object 

Se funziona, si potrebbe andare avanti, utilizzando il nuovo repository clonato come repo principale.

+0

Ho paura che questo non aiuti. Ho creato un pacchetto di questo tipo ed è 60 MB. Tuttavia il mio file pack in .git/objects/pack è di 64 MB e tutti gli oggetti a oggetti liberi prendono 32 MB. Ho provato a fare riferimento a un commit penzolante (del mio repository) nel pacchetto ma non ha funzionato (qualcuno sa come?). –

+1

@PaulPladijs: ma un clone di quel pacchetto contiene oggetti non compressi? Sono d'accordo che un bundle git è probabile che consideri solo il commit referenziato, però. – VonC

1

L'avviso di git-gui è solo un suggerimento che si potrebbe voler fare un po 'di manutenzione. Per la maggior parte delle persone che hanno un numero elevato di oggetti sta solo rallentandoli. Nel tuo caso, dovresti disabilitare l'avviso. La funzione in questione è hint_gc e viene chiamata da vicino alla fine del file di script git-gui. Basta commentare come di seguito.

if {[is_enabled multicommit]} { 
     #after 1000 hint_gc 
} 

Il business multicommit è un flag che determina se ci sono in esecuzione come committool o uno scopo applicazione generale.

Se si desidera utilizzare git-gui normalmente altrove, è possibile aggiungere invece un flag specifico per il respository. Qualcosa di simile:

if {[is_enabled multicommit] && ![is_config_true gui.skip_gc_warning]} { 
     after 1000 hint_gc 
} 

dovrebbe consentire di utilizzare git config --bool gui.skip_gc_warning true disabilitare che su una base per-repository.

+0

Questa è una buona idea! L'ho provato ma devi rimuovere i caratteri di sottolineatura '_' in' skip_gc_warning' per farlo funzionare. Sto ancora aspettando una soluzione di repack (sono curioso di sapere se è possibile). Altrimenti questa potrebbe diventare la migliore risposta. –

Problemi correlati