Nettoyer un dépôt Git

"Et je ne ferai pas ça tous les jours !"

Le blog Makina-corpus

"Et je ne ferai pas ça tous les jours !"

Pour diverses raisons (erreurs, mauvaise gestion, …), il arrive qu'un dépôt git prenne une taille démesurée, ce qui peut vite devenir handicapant. Il devient donc parfois nécessaire de faire un peu de ménage et retirer complètement certains fichiers du dépôt peut être une solution efficace.

Attention, lorsqu'on dit ici retirer un fichier du dépôt, il ne s'agit pas de simplement faire un commit le supprimant (ce qui ne changerait en rien la taille du dépôt), mais de modifier l'historique complet des commits pour faire en sorte de l'en retirer complètement. Cette ré-écriture complète de l'historique rendra le dépôt incompatible avec tout autre clone du même projet.

Cette solution peut également permettre de retirer d'un projet des fichiers contenant des données sensibles ou confidentielles.

À partir d'un dépôt local, à jour

  • Retirer tous les remotes. Par exemple, pour retirer le remote origin :
git remote rm origin
  • Supprimer toutes les références du fichier à effacer :
git filter-branch --index-filter 'git rm --cached --ignore-unmatch fichier_a_effacer.zip -- --all'
  • filter-branch est la commande permettant de ré-écrire la branche courante.
    • --index-filter permet d'accélérer le traitement en traitant l'index au lieu des fichiers du disque.
  • rm supprime.
    • --cached modifie l'index et la zone d'attente au lieu des fichiers du disque.
    • --ignore-unmatch permet de ne pas générer d'erreur si la référence à supprimer n'existe pas.
    • -- --all permet d'agir sur toutes les branches.
  • La commande filter-branch génère automatiquement une sauvegarde qu'il nous faut supprimer pour réellement alléger le dépôt (Attention, à partir d'ici on est réellement destructif, pas de retour en arrière possible) :
rm -rf .git/refs/original/
rm -rf .git/logs/
  • Pour terminer, le garbage collector va supprimer tous les objets qui ne sont plus référencés :
git gc --aggressive --prune=now
  • --aggressive optimise plus profondément le dépôt.
  • --prune=now supprime tous les objets inutilisés immédiatement (par défaut, --prune supprime uniquement les objets inutilisés depuis plus de deux semaines).

Pour une version plus détaillée, vous pouvez vous référer à la version française du livre Pro Git accessible librement en ligne.

Vous pouvez aussi bien sûr venir suivre notre formation Git!

Formations associées

Outils et bases de données

Git, gestionnaire de versions

A distance (foad) Du 4 au 5 octobre 2021

Voir la formation

Actualités en lien

20/07/2021

Accéder à sa base de données PostgreSQL depuis QGis ou pgAdmin de manière sécurisée

Comment interconnecter ses outils de travail sans mettre en péril la sécurité du système informatique ? L’objectif de cet article est de présenter une manière sécurisée de connecter QGis ou pgAdmin à une base de données PostgreSQL, afin d’atteindre le meilleur compromis entre praticité et sécurité.

Voir l'article
03/07/2020

Webmapping : comparaison des serveurs de tuiles vectorielles depuis Postgres / PostGIS

Un ensemble de serveurs de tuiles vectorielles basés sur la fonction ST_AsMVT() de PostGIS sont disponibles. Makina Corpus vous propose un tour d’horizon des spécificités des différentes solutions.

Voir l'article
28/01/2020

Paralléliser des requêtes avec PostgreSQL

PostgreSQL permet de découper les requêtes pour en exécuter des parties en parallèle. Il faut toutefois en connaître les concepts pour pouvoir en bénéficier au mieux et ne pas empêcher le planificateur de requêtes de le faire.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus