2013-02-20 20 views
8

Ho alcuni commit creati da git subtree che voglio avere garbage collection (più che qualsiasi scopo pratico solo per capire cosa e perché può essere raccolto).Garbage Collect impegna in git

ho già verificato che questi si impegna a non fanno riferimento le seguenti modalità:

# In any reflog 
> git reflog --all --no-abbrev-commit | grep <hash> 
(no output) 

# In any branch, local or remote 
> git branch --contains <hash> 
(no output) 
> git branch -r --contains <hash> 
(no output) 

# In any tag 
> git tag --contains <hash> 
(no output) 

# In the current index 
> git rev-list HEAD | grep <hash> 
(no output) 

# In references from filter-branch 
> ls .git/refs/original/ 
(the folder does not exist) 

Questi sono il luogo che git gc documentation liste che potrebbero contenere riferimenti.

Ancora il commit specificato esiste ancora dopo git gc.

Mi manca qualcosa? O c'è qualche comando di git plumbing che controlla tutti questi riferimenti?

risposta

10

Ogni volta che voglio eliminare gli oggetti sciolti, io uso i seguenti comandi:

rm -rf .git/refs/original/* 
git reflog expire --all --expire-unreachable=0 
git repack -A -d 
git prune 
+0

Eccellente, quello che mancava era il reimballaggio. Anche gli oggetti non raggiungibili non saranno disposti se sono impacchettati con oggetti raggiungibili. Quindi il 'repack' li separa e quindi' git prune' o 'git gc' li eliminerà correttamente. – LopSae

+0

Anche quando si utilizza 'git prune', il mio repository aveva ancora oggetti liberi. Se si verifica ciò, 'git gc' doc indica che prova * molto duramente * per essere sicuro e mantiene possibili riferimenti. Assicurati di pulire/refs,/logs, FETCH_HEAD e altra cache che potresti trovare nella tua cartella .git. Quindi rieseguire 'git gc --prune = now' farà il trucco. – jsgoupil

6

I commit (o oggetti in generale) non vengono effettivamente eliminati finché non sono stati decompressi in oggetti sciolti e lasciati in questo modo per almeno 2 settimane. È possibile utilizzare git gc --prune=now per saltare il ritardo di 2 settimane.

Normalmente ciò che succede è git comprimerà i tuoi oggetti insieme in un file pack. Ciò fornisce una compressione ed efficienza molto migliori rispetto agli oggetti liberi. Ciò accade in genere ogni volta che viene eseguito un git gc. Tuttavia, se un oggetto non viene referenziato, lo git gc lo decomprimerà in un oggetto libero.

Una volta spacchettato, git gc eliminerà automaticamente vecchi oggetti senza riferimenti. Questo è controllato dal flag --prune=<date>, che per impostazione predefinita è 2 settimane fa, quindi elimina ogni vecchio oggetto senza riferimento più vecchio di 2 settimane. Specificando --prune=now, stai chiedendo a git gc di eliminare tutti gli oggetti più vecchi di adesso, il che significa sostanzialmente di eliminare qualsiasi oggetto senza riferimento esistente.

+0

provato questo e ancora il impegnano a non viene raccolta. – LopSae

+2

@LopSae: hai provato a eseguire 'git fsck --unreachable' per assicurarti che i tuoi commit siano veramente irraggiungibili? –

+1

Appena provato e non viene visualizzato, il che significa che è raggiungibile da qualche parte, ma non riesco a trovare da dove. – LopSae

Problemi correlati