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

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.

Consigliata per te

Blog di Bitbucket

Percorso di apprendimento DevOps

Scopri di piรน su Git

Trova altre guide e risorse su Git in questo hub.