I repository Git di grandi dimensioni possono utilizzare molte risorse e rallentare il computer. Questo a volte può essere mitigato utilizzando la clonazione superficiale, che elimina tutti tranne i commit più recenti, rendendo più semplice il download di repository Git con lunghe cronologie.
Cos’è la clonazione superficiale? La clonazione di un repository non solo crea una copia dell’intero repository, ma anche la cronologia completa dei commit. Per la maggior parte dei repository, la dimensione complessiva e la lunghezza della cronologia dei commit non sono un problema. Tuttavia, per repository molto grandi, la clonazione di tutti quei dati può richiedere molto tempo e molte risorse.
Ad esempio, il kernel Linux ha utilizzato lo stesso repository sin dall’alba dei tempi. È finita 1,1 milioni di impegni. La clonazione può richiedere fino a un’ora su hardware meno recente e utilizzarne più gigabyte di RAM solo per il solo processo Git. Ovviamente non tutti i repository sono così enormi, ma alcuni si avvicinano e persino i contributori del kernel Linux non vogliono sedersi alla tastiera per un’ora a guardarlo clonare.
La clonazione superficiale è una tecnica che recupera solo un numero limitato di commit recenti. Ciò si traduce in un clone leggero e più veloce che conserva ancora le funzionalità necessarie per il tuo lavoro, poiché alla maggior parte delle persone non interessano i commit precedenti e puoi comunque inviare PR e inviare modifiche senza l’intera cronologia.
Ciò ha anche grandi vantaggi per le pipeline di integrazione continua (CI/CD), poiché il server di compilazione probabilmente non ha bisogno di conoscere l’intera cronologia Git solo per creare l’applicazione. Se stai scrivendo script che funzionano con i repository Git e ti interessa solo il contenuto, potrebbe valere la pena usare invece la clonazione superficiale.
Oltre al solo tempo di clonazione, i repository superficiali vengono eseguiti più velocemente in generale, poiché c’è meno cronologia da elaborare durante l’esecuzione dei comandi quotidiani. Le cronologie molto lunghe possono anche causare ritardi nei client Git della GUI, il che può rovinare l’esperienza.
Il modo più semplice per clonare in modo superficiale è semplicemente usare il file –depth parametro attivo git clone. Ciò limiterà il clone a un certo numero, come 100 commit prima dell’attuale repository HEAD. Tutti gli altri commit meno recenti verranno troncati dalla cronologia.
git clone –depth 100 [repository_URL] Puoi anche clonare tutto in modo superficiale dopo una certa data, il che è molto più utile se non sai di quanti commit hai bisogno.
git clone –shallow-since=”3 months” [repository_URL] Il parametro data può accettare molti formati diversima un semplice “X anni/mesi fa” generalmente funziona bene.
Ci sono anche metodi per rendere superficiale un repository Git esistente, ma di solito sono disordinati e comportano la riscrittura della cronologia e la cancellazione manuale di tutti i vecchi oggetti dalla cache di raccolta dei rifiuti di Git. Ti consigliamo di eseguire il push di tutte le modifiche, rimuovere il vecchio repository e clonare nuovamente dal telecomando se desideri ridurre le dimensioni del repository esistente.
Clonazione superficiale di un solo ramo La clonazione superficiale può essere combinata con un’altra funzionalità di Git che limita il clone a un solo ramo. Se stai solo scaricando un repository per controllare un feature branch, puoi invece eseguire questo comando:
git clone –depth 100 [repository_URL] –single-branch –branch=[branch] Cloni senza macchie e senza alberi Un’altra opzione simile che può ancora preservare la cronologia dei commit è utilizzando cloni blobless. In Git, il contenuto effettivo del file viene archiviato come “blob” e Git aggiunge alberi e commit che tengono traccia di come questi BLOB vanno insieme.
I quadrati sono blob, i triangoli sono alberi e i cerchi sono i commit rivolti all’utente che puntano a tutto. Poiché Git si preoccupa principalmente solo dei commit e della struttura ad albero, puoi scegliere di omettere i BLOB e scaricarli su richiesta quando sono necessari. Ciò può accelerare notevolmente i tempi di clonazione mantenendo anche la cronologia. Puoi anche combinare cloni blobless e poco profondi.
Per fare questo, corri git clone con un set di filtri:
git clone –filter=blob:none [repository_URL] I cloni treeless sono simili e spesso utilizzati per l’automazione, ma in genere non sono consigliati per l’uso quotidiano poiché possono effettivamente essere più lenti per le operazioni Git quotidiane.
git clone –filter=tree:0 [repository_URL] In genere, tuttavia, i cloni superficiali saranno ancora più veloci e i cloni senza blob aumenteranno di dimensioni nel tempo man mano che è necessario accedere a più parti del repository.