Git gc
Il comando git gc
è un comando di manutenzione del repository. "gc" sta per garbage collection. Eseguire git gc
significa letteralmente dire a Git di ripulire il disordine che è stato creato nell'attuale repository. La garbage collection è un concetto che deriva da linguaggi di programmazione interpretati che eseguono l'allocazione dinamica della memoria. La garbage collection in linguaggi interpretati viene utilizzata per recuperare la memoria che è diventata inaccessibile al programma in esecuzione.
I repository Git accumulano vari tipi di elementi garbage. Un tipo di garbage Git è dato dai commit orfani o inaccessibili. I commit Git possono diventare inaccessibili quando si eseguono comandi che alterano la cronologia come git resets o git rebase. Nel tentativo di preservare la cronologia ed evitare la perdita di dati, Git non eliminerà i commit distaccati. Un commit distaccato può ancora essere verificato, selezionato con cura ed esaminato tramite git log
.
Oltre alla pulizia dei commit separati, git gc
eseguirà anche la compressione sugli oggetti Git archiviati, liberando spazio prezioso su disco. Quando Git identifica un gruppo di oggetti simili, li comprime in un «pacchetto». I pacchetti sono come i file zip di oggetti Git e risiedono nella directory ./git/objects/pack
directory all'interno di un repository.
Cosa fa effettivamente git gc?
Prima dell'esecuzione, git gc
controlla prima diversi valori di git config. Questi valori aiuteranno a chiarire il resto della responsabilità di git gc
.
Configurazione di git gc
gc.reflogExpire
Una variabile opzionale che per impostazione predefinita è pari a 90 giorni. È usata per stabilire per quanto tempo devono essere conservati i record in un reflog di branch.
gc.reflogExpireUnreachable
Una variabile opzionale che per impostazione predefinita è pari a 30 giorni. Viene utilizzata per impostare per quanto tempo devono essere conservati i record di reflog inaccessibili.
gc.aggressiveWindow
materiale correlato
Come spostare un repository Git completo
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
Una variabile opzionale che per impostazione predefinita è pari a 250. Controlla quanto tempo viene impiegato nella fase di compressione delta dell'object packing quando git gc
viene eseguito con l'opzione --aggressive
.
gc.aggressiveDepth
Una variabile opzionale che per impostazione predefinita è pari 50. Controlla la profondità della compressione utilizzata da git-repack
durante un'esecuzione di git gc --aggressive
gc.pruneExpire
Una variabile opzionale che per impostazione predefinita è "2 settimane fa". Imposta per quanto tempo un oggetto inaccessibile verrà conservato prima del pruning
gc.worktreePruneExpire
Una variabile opzionale che per impostazione predefinita è "3 mesi fa". Imposta per quanto tempo un albero funzionante obsoleto verrà conservato prima di essere eliminato.
Esecuzione di git gc
Dietro le quinte git gc
esegue effettivamente un pacchetto di altri sottocomandi interni come git prune, git repack
, git pack
e git rerere
. La responsabilità generale di questi comandi è identificare qualsiasi oggetto Git che si trovi al di fuori dei livelli di soglia impostati dalla configurazione git gc
. Una volta identificati, questi oggetti vengono quindi compressi o sottoposti a pruning di conseguenza.
Best practice e domande frequenti su git gc
La garbage collection viene eseguita automaticamente su diversi comandi usati di frequente:
La frequenza con cui git gc
deve essere eseguito manualmente corrisponde al livello di attività di un repository. Un repository con un solo sviluppatore che contribuisce dovrà eseguire git gc
molto meno spesso di un repository multiutente aggiornato di frequente.
git gc e git prune a confronto
git gc
è un comando principale e git prune
è un comando subordinato. git gc
attiverà internamente git prune
. git prune
viene usato per rimuovere oggetti Git che sono stati ritenuti inaccessibili dalla configurazione git gc
. Maggiori informazioni su git prune.
Cos'è git gc aggressive?
git gc
può essere richiamato con l'opzione della riga di comando --aggressive
. L'opzione --aggressive
fa sì che git gc
dedichi più tempo al suo impegno di ottimizzazione. Questo rallenta il funzionamento di git gc
ma farà risparmiare più spazio su disco dopo il suo completamento. Gli effetti di --aggressive
sono persistenti e devono essere eseguiti solo dopo un grande volume di modifiche a un repository.
Cos'è git gc auto?
La variante del comando git gc --auto
verifica innanzitutto se è richiesta una pulizia del repository prima dell'esecuzione. Se rileva che le pulizie non sono necessarie, esce senza svolgere alcun lavoro. Alcuni comandi Git eseguono implicitamente git gc --auto
dopo l'esecuzione per ripulire eventuali oggetti liberi che hanno creato.
Prima dell'esecuzione git gc --auto
controllerà la configurazione git
per i valori di soglia sugli oggetti sciolti e le dimensioni della compressione dei pacchetti. Questi valori possono essere impostati con git config. Se il repository supera una delle soglie di gestione, verrà eseguito git gc --auto
.
Guida introduttiva a git gc
Probabilmente stai già usando git gc
senza accorgertene. Come discusso nella sezione delle best practice, viene richiamato automaticamente tramite i comandi usati di frequente. Se vuoi richiamarlo manualmente, esegui semplicemente git gc
e dovresti vedere un output che indica il lavoro svolto.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.