Supprimer des fichiers binaires de l historique de commit avec Git

De Ensiwiki
Aller à : navigation, rechercher
Git

Environnement Windows, MacOS, Linux

Type Gestionnaire de versions
Licence GPLv2

Site Web http://git-scm.com/

On part du principe que vous connaissez déjà les bases de Git (clone, push, pull, branch...). Cette page explique comment supprimer des fichiers binaires générés de l'historique.

Note du rédacteur : cette page comporte probablement des fautes d'orthographe, votre aide est la bienvenue !

Pourquoi avoir rajouté des fichiers binaires générés ?

  • Pour casser les détections de dépendances de Make ou des autres outils de gestion de la compilation, la date du fichier étant celle du checkout, pas la date de sa compilation.
  • Pour casser tous les merge
  • Pour manger de la place disque
  • Pour dépasser la limite hard de 50Mo lors du rendu d'un projet dans Teide

Donc, après avoir ajouté ces fichiers, il faut parfois les enlever.

Cas favorable: ajout dans le dernier commit, sans avoir fait de push, uniquement localement

Il suffit de refaire ce dernier commit !

git rm
pour enlever les fichiers et
git commit --amend
pour refaire le commit.

Cas pas trop défavorable: ajout dans des commits locaux, sans avoir fait de push, uniquement localement

Vous devriez lire [[1]]. La partie qui vous intéresse est celle expliquant
git rebase -i

You loose: vous avez déjà publiés, avec push, les commits problématiques

Attention, les commandes suivantes vont éditer votre historique ! Il deviendra incompatible avec les entrepôts distants. Les push et les pull ne fonctionneront plus !.

Vous ne pourrez plus envoyer vos commit vers les même entrepôts distants comme depots ou github.

Édition à la main

Si il n'y a que quelques commits fautifs
git rebase -i
peut vous suffire (cf. la section précédente)

Édition automatique à grande échelle

Exemple choisit au hasard: un répertoire Galerie/ a été ajoutée. Il contient des images, avec de nouvelles versions dans de nombreux commits pour plusieurs dizaines de Mo.

Les commandes suivantes vont supprimer de l'histoire le répertoire Galerie (filter-branch), puis enlever les morceaux de l'histoire qui ne sont plus attachés à la nouvelle histoire (gc --prune=now --aggressive).

(Attention aux quotes dans la commande filter-branch !)

du -hs . # cela affiche 53M

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch Galerie/'

du -hs . # cela affiche encore 53M

git gc --prune=now --aggressive

du -hs . # affiche 6.1M