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.reflogExpireUna 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.reflogExpireUnreachableUna 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.aggressiveWindowUna 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.aggressiveDepthUna 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.pruneExpireUna variabile opzionale che per impostazione predefinita รจ "2 settimane fa". Imposta per quanto tempo un oggetto inaccessibile verrร conservato prima del pruning
gc.worktreePruneExpireUna 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.