Comment utiliser Git Shallow Clone pour un clonage plus rapide du référentiel
Les dépôts Git volumineux peuvent utiliser beaucoup de ressources et ralentir votre ordinateur. Cela peut parfois être atténué en utilisant un clonage superficiel, qui supprime tous les commits sauf les plus récents, ce qui facilite le téléchargement des dépôts Git avec de longs historiques.
Sommaire
Qu’est-ce que le clonage superficiel ?
Le clonage d’un référentiel crée non seulement une copie de l’intégralité du référentiel, mais également son historique de validation complet. Pour la plupart des référentiels, la taille et la longueur globales de l’historique de validation ne sont pas un problème. Cependant, pour les référentiels très volumineux, le clonage de toutes ces données peut prendre beaucoup de temps et de ressources.
Par exemple, le noyau Linux utilise le même référentiel depuis la nuit des temps. Il a plus 1,1 million de commits. Le clonage peut prendre plus d’une heure sur du matériel plus ancien et utiliser plusieurs gigaoctets de RAM juste pour le processus Git seul. Bien sûr, tous les référentiels ne sont pas aussi énormes, mais certains s’en rapprochent, et même les contributeurs du noyau Linux ne veulent pas rester assis devant leur clavier pendant une heure à le regarder cloner.
Le clonage superficiel est une technique qui ne récupère qu’un nombre limité de commits récents. Cela se traduit par un clone léger et plus rapide qui conserve toujours les fonctionnalités nécessaires à votre travail, car la plupart des gens ne se soucient pas des anciens commits, et vous pouvez toujours soumettre des PR et pousser des modifications sans l’historique complet.
Cela présente également de grands avantages pour les pipelines d’intégration continue (CI/CD), car le serveur de build n’a probablement pas besoin de connaître l’intégralité de l’historique Git uniquement pour créer l’application. Si vous écrivez des scripts qui fonctionnent avec les référentiels Git et que vous ne vous souciez que du contenu, cela peut valoir la peine d’utiliser le clonage superficiel à la place.
Outre le temps de clonage, les référentiels superficiels s’exécutent généralement plus rapidement, car il y a moins d’historique à traiter lors de l’exécution de commandes quotidiennes. Des historiques très longs peuvent également entraîner un décalage des clients GUI Git, ce qui peut ruiner l’expérience.
Clonage superficiel d’un référentiel Git
Le moyen le plus simple de cloner peu profond consiste simplement à utiliser le --depth
paramètre sur git clone
. Cela limitera le clone à un certain nombre, comme 100 commits avant le HEAD du référentiel actuel. Tous les autres commits plus anciens seront tronqués de l’historique.
git clone --depth 100 [repository_URL]
Vous pouvez également tout cloner superficiellement après une certaine date, ce qui est beaucoup plus utile si vous ne savez pas de combien de commits vous avez besoin.
git clone --shallow-since="3 months" [repository_URL]
Le paramètre de date peut accepter de nombreux formats différents, mais un simple « il y a X ans/mois » fonctionne généralement bien.
Il existe également des méthodes pour réduire en profondeur un référentiel Git existant, mais elles sont généralement compliquées et impliquent la réécriture de l’historique et la suppression manuelle de tous les anciens objets du cache de récupération de place de Git. Nous vous recommandons de simplement pousser toutes les modifications, de supprimer l’ancien référentiel et de recloner à partir de la télécommande si vous souhaitez réduire la taille de votre référentiel existant.
Clonage superficiel d’une seule branche
Le clonage superficiel peut être combiné avec une autre fonctionnalité Git qui limite le clone à une seule branche. Si vous téléchargez simplement un dépôt pour extraire une branche de fonctionnalité, vous pouvez exécuter cette commande à la place :
git clone --depth 100 [repository_URL] --single-branch --branch=[branch]
Clones sans taches et sans arbres
Une autre option similaire qui peut toujours conserver l’historique des commits consiste à utiliser des clones sans blobles. Dans Git, le contenu réel du fichier est stocké sous forme de « blobs », et Git ajoute au-dessus de ces arbres et commits qui suivent la façon dont ces blobs vont ensemble.
Étant donné que Git ne se soucie principalement que des commits et de l’arborescence, vous pouvez choisir d’omettre les blobs et de les télécharger à la demande lorsqu’ils sont nécessaires. Cela peut considérablement accélérer les temps de clonage tout en conservant l’historique. Vous pouvez également combiner des clones sans bulles et peu profonds.
Pour ce faire, exécutez git clone
avec un jeu de filtres :
git clone --filter=blob:none [repository_URL]
Les clones sans arborescence sont similaires et souvent utilisés pour l’automatisation, mais ne sont généralement pas recommandés pour une utilisation quotidienne car ils peuvent en fait être plus lents pour les opérations Git quotidiennes.
git clone --filter=tree:0 [repository_URL]
En règle générale, cependant, les clones superficiels seront toujours plus rapides et les clones sans blobles augmenteront en taille au fil du temps, car davantage de parties du référentiel doivent être accessibles.