Come ridurre la cartella .git


134

La mia base attuale ha una dimensione totale di ca. 200MB.

Ma la mia cartella .git ha una dimensione incredibile di 5 GB (!). Da quando spingo il mio lavoro su un server esterno, non ho bisogno di alcuna grande cronologia locale ...

Come posso ridurre la cartella .git per liberare spazio sul mio notebook? Posso eliminare tutte le modifiche più vecchie di 30 giorni?

grazie mille per qualsiasi aiuto :)


2
Puoi pubblicare l'output di git count-objects -v?
CB Bailey

2
Possibile duplicato della dimensione del repository Redit git
sds

Risposte:


113

non dovresti eliminare tutte le modifiche più vecchie di 30 giorni (penso che sia in qualche modo possibile sfruttare git, ma in realtà non è raccomandato).

puoi chiamare git gc --aggressive --prune, che eseguirà la garbage collection nel tuo repository e poterà i vecchi oggetti. hai molti file binari (archivi, immagini, file eseguibili) che cambiano spesso? quelli di solito portano a enormi cartelle .git (ricorda, git archivia le istantanee per ogni revisione e i file binari si comprimono male)


32
In realtà, git gc --aggressiveè considerata una cattiva pratica. È meglio usare git repack -a -d --depth=250 --window=250.
Artefatto2

18
@knittl: assolutamente. Ecco un messaggio dello stesso Linus: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefatto2

3
@ artefact2: grazie per il link! l'ho letto, e Linus sottolinea che - aggressivo non riutilizzerà (buoni) delta - che sembrano non esistere in questa domanda, perché il repository è enorme. andare in senso repack richiederà in realtà molto più tempo. git gc --aggressivechiama il repack con una dimensione della finestra di 250 (vedi la manpage) e una profondità di 250 (vedi il codice sorgente). --aggressive aggiunge inoltre l' -finterruttore, per buttare via e ripetere tutte le precedenti operazioni delta (come anche menzionato nel link)
knittl

1
Ho appena controllato il repository hg.nginx.org/nginx (RELEASE-1.4.0 è un suggerimento) usando git-remote-hg e questo ha prodotto un repository di circa 100 MB. L'utilizzo ha git gc --aggressive --pruneportato questo a 19 MB.
Lekensteyn,

15
@ Artefact2 La tua affermazione è obsoleta : nota quanti anni ha quel post. In effetti, nello stesso giorno in cui è stato pubblicato, la discussione sulla mailing list ha portato a questo commit: [..] Quindi i parametri di imballaggio sono gli stessi in entrambi i metodi. . --prunenon è inoltre necessario poiché è diventato il valore predefinito da v1.5.5-rc0(commit 25ee973 , marzo 2008).
Lekensteyn,

68

Ecco cosa ha da dire il creatore di git Linus su come ridurre il repository git:

L'equivalente di "git gc --aggressive" - ​​ma fatto * correttamente * - è fare (da un giorno all'altro) qualcosa del genere

   git repack -a -d --depth=250 --window=250

dove quella profondità è solo quanto profonda possono essere le catene delta (allungale per la vecchia storia - vale la pena lo spazio in testa), e la cosa della finestra è su quanto grande è la finestra di un oggetto che vogliamo che ciascun candidato delta scansioni.

E qui, potresti voler aggiungere il flag "-f" (che è il "drop all old delta", poiché ora stai effettivamente cercando di assicurarti che questo in realtà trovi buoni candidati.

fonte: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

Questo eliminerà i dati binari rimasti orfani nel mio repository? "git repack" non eliminerà le immagini o i dati binari che sono stati controllati nel repository e quindi eliminati. Per eliminare definitivamente quel tipo di dati dal tuo repository devi riscrivere la cronologia. Un esempio comune di ciò è quando si controlla accidentalmente le password in git. Puoi tornare indietro ed eliminare alcuni file ma poi devi riscrivere la tua cronologia da allora fino ad ora e quindi forzare il push quindi il nuovo repository alla tua origine.


Per me, la cartella .git è di circa 1,5 G. Ho provato questo, ma ho avuto un errore di followng. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron,

2
Dopo l'esecuzione a repacklivello locale, eseguendo il commit e il push, anche il restringimento verrà reso remoto?
Timo,

@David Dehghan: Ehi, ci ho provato dalla directory del progetto ma la dimensione della cartella .git non è cambiata. È previsto o devo spingere per vedere le modifiche? (scusate non ho molta esperienza con git.) Ho un'immagine / gif in repo e ho commesso diverse volte versioni diverse di quell'immagine e suppongo che abbia aumentato la dimensione .git.
giorgim,

Salve, sfortunatamente è così che ripulisci la vecchia versione binaria. Per fare ciò devi riscrivere la tua storia che è in realtà complicata. Ecco alcuni suggerimenti
David Dehghan

22

Ho provato questi, ma il mio repository era ancora molto grande. Il problema era che avevo verificato accidentalmente alcuni file generati di grandi dimensioni. Dopo alcune ricerche ho trovato un ottimo tutorial che semplifica l'eliminazione dei file generati di grandi dimensioni. Questo tutorial mi ha permesso di ridurre il mio repository da 60 MB a <1 MB.

Steve Lorek, Come ridurre un repository Git


4
Ecco una versione archiviata in caso di putrefazione dei link. Questa risposta è / è stata utile per un repository in cui mi sono imbattuto dove sono stati impegnati file .exe e .zip che gonfiavano le dimensioni della cartella .git
doubleDown

9

5 GB contro 200 MB è un po 'strano. Prova a correre git gc.

No, a meno che non si divida il repository in moduli, non è possibile ridurre la dimensione della .gitdirectory.

Ogni clone di un repository git è un repository completo che può fungere da server. Questo è il principio di base del controllo della versione distribuita.


3

Sto usando git più come meccanismo di sincronizzazione che per la cronologia delle versioni. Quindi la mia soluzione a questo problema è stata quella di assicurarmi di avere tutte le mie fonti correnti in uno stato soddisfacente, quindi eliminare .git e inizializzare nuovamente i repository. Problema di spazio su disco risolto. :-) La storia è andata :-( Lo faccio perché il mio repository si trova su una piccola chiave USB. Non voglio né ho bisogno di tutta la mia cronologia. Se avessi un metodo per troncare la cronologia, lo userei.

Se fossi interessato a conservare la mia storia, archiverei l'attuale repository. Ad un certo punto dopo potrei clonare il repository originale, copiare su tutte le modifiche dal nuovo repository (supponiamo che non abbia fatto molto (alcun) rinominare o eliminare). Quindi esegui un grande commit che rappresenterebbe tutte le modifiche apportate nel nuovo repository come un singolo commit nel vecchio repository. È possibile unire le storie? Forse se avessi usato un ramo e poi cancellato gli oggetti di cui non avevo bisogno. (Non so abbastanza di Git Internals per iniziare a scherzare in quel modo).


1
Invece, puoi usare Dropbox per questo caso d'uso. L'ho fatto per molti anni.
Jonny

0

Ho provato sopra i metodi, nel mio caso non ha funzionato nulla (dove ho accidentalmente interrotto il processo git durante git push) quindi alla fine ho dovuto eliminare il repository e clonarlo di nuovo e ora la cartella .git è di dimensioni normali.


Ho dovuto usare la stessa soluzione perché il mio disco era pieno (la cartella .git era> 90 GB) quindi non potevo nemmeno eseguire un repack o git gc!
Fl4v,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.