2012-03-31 8 views
57

Recentemente ho eseguito git fsck --lost-found sul mio repository.git: blob penzolanti

Mi aspettavo di vedere un paio di commit penzolanti, dove avevo azzerato HEAD.

Tuttavia, sono stato sorpreso di vedere probabilmente diverse migliaia di messaggi di blob penzolanti.

Non credo che ci sia qualcosa di sbagliato nel mio repository, ma sono curioso di sapere cosa causa questi blob penzolanti? Ci sono solo due persone che lavorano sul repository e non abbiamo fatto nulla fuori dall'ordinario.

Non penserei che siano stati creati da una versione precedente di un file che è stato sostituito da uno nuovo, dal momento che git avrebbe dovuto rimanere su entrambi i BLOB in modo che potesse visualizzare la cronologia.

Vieni a pensarci, a un certo punto abbiamo aggiunto per errore una directory MOLTO grande (migliaia di file) al progetto e poi la rimuoviamo. Potrebbe essere questa la fonte di tutti i blob penzolanti?

Solo in cerca di comprensione di questo mistero.

risposta

49

L'ultima volta che ho guardato questo mi sono imbattuto this thread, in particolare questa parte:

È possibile anche finire con oggetti pendenti in confezioni. Quando il pacchetto è reimballato, tali oggetti verranno allentati e quindi scaduti alla fine secondo la regola sopra menzionata. Tuttavia, credo che gc non sarà sempre imballare vecchi pacchetti; farà nuovi pacchetti finché non avrai molti pacchetti, e poi li combinerai tutti (almeno questo è ciò che farà "gc --auto"; io non ricordo se solo "git gc" segue la stessa regola).

Quindi è un comportamento normale e alla fine viene raccolto, credo.

edit: Per Daniel, è possibile raccogliere immediatamente eseguendo

git gc --prune="0 days" 
+3

cosa accadrà se quei blob sono rimuovere? – nferocious76

+0

@ nferocious76 quindi non è possibile recuperare file che, ad esempio, sono stati aggiunti alla gestione temporanea ma non sono stati impegnati e sono stati quindi rimossi (tramite rm -f). Una volta eseguito il GC, i file vengono persi definitivamente. –

+0

@DavidBrower, vedo grazie. Quindi rimuove anche i file non collegati o non referenziati. – nferocious76

16

Ogni volta che si add un file per l'indice, il contenuto di tale file viene aggiunto al database degli oggetti di Git come un blob. Quando poi reset/rm --cached quel file, saranno ancora presenti le macchie (saranno immondizia raccolti la prossima volta che si esegue gc)

Tuttavia, quando questi file sono parte di una impegnano e si decide in seguito a reset storia, allora i vecchi commit sono ancora raggiungibili dal reflog di Git e saranno raccolti solo dopo un periodo di tempo (di solito un mese, iirc). Questi oggetti non dovrebbero apparire come penzoloni, dal momento che sono ancora referenziati dal reflog.

+2

Vale anche la pena notare che se si aggiusta un file e si re-'add' esso, il precedente diventa un blob penzolante allo stesso modo. (Generalmente uso la sequenza: hackerare, 'git add',' git diff --cached' e/o 'git status' fino a quando non sono felici, quindi' git commit', quindi ne ho un sacco. :-)) – torek

23

ero davvero impaziente e utilizzati:

git gc --prune="0 days"