Close

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
Database
materiale correlato

Come spostare un repository Git completo

Logo di Bitbucket
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.

Le persone collaborano utilizzando una parete piena di strumenti

Blog di Bitbucket

Illustrazione su Devops

Percorso di apprendimento DevOps

Funzione Demo Den per demo con esperti Atlassian

Come Bitbucket Cloud funziona con Atlassian Open DevOps

Iscriviti alla nostra newsletter DevOps

Thank you for signing up