2014-12-15 2 views
6

Ho un repository con un solo commit che ha una dimensione fuori controllo di 95M. Tuttavia, non riesco a ottenere la dimensione della cartella .git sotto 213M. Tuttavia, se creo un nuovo repository con lo stesso contenuto di file, ottengo una cartella .git di soli 38M.Perché git non ridurrà ulteriormente la dimensione del repository?

C'è un modo per git di ricostruire i suoi oggetti in modo tale da ottenere la dimensione più in linea con la figura dalla creazione di un nuovo repository?

Ho provato sia git gc --prune=now --aggressive e git repack -adf --window=250 --depth=250 per ridurre le dimensioni del repository. Hanno portato il repository giù dal 220M originale.

Immagino che git debba tenere un riferimento da qualche parte che impedisce la raccolta dei rifiuti, ma non so dove si troverebbero. Ho rimosso tutti i telecomandi e rami e non vedo altro che il mio ramo corrente con 'arbitri'

$ ls -R .git/refs 
.git/refs/: 
heads tags 

.git/refs/heads: 
master 

.git/refs/tags: 

ho creato il repository da uno esistente con la storia più lunga. Ho utilizzato checkout --orphan per creare un nuovo ramo senza base, quindi ho eseguito un commit per creare un nuovo commit con lo stato del repository. Ho quindi eliminato il ramo originale e rimosso i telecomandi prima di eseguire gc.

$ git --version 
git version 1.9.4.msysgit.0 
+2

Elimina i reflog, probabilmente è dove si nascondono le cose. – torek

+0

possibile duplicato di [Ridurre le dimensioni del repository git] (http://stackoverflow.com/questions/2116778/reduce-git-repository-size) –

+0

@AndrewC Questo è quello che ho provato ad usare e dove ho ottenuto il comando 'gc' sopra, ma al momento non ha fatto menzione del reflog. – vossad01

risposta

5

Esecuzione:

git reflog expire --all --expire=now 
git gc --prune=now --aggressive 

portato la cartella fino a 27M. Grazie a @torek per il commento che suggerisce di pulire il reflog!

Avevo pensato che il reflog non fosse un problema perché se avessi eseguito git reflog ho visto solo una voce, il mio singolo commit. In risposta al suggerimento di @ torek ho trovato How to remove unused objects from a git repository? che è dove ho trovato il comando per cancellare il reflog.