410 votes

Supprimer le dossier et son contenu de l'historique de git/GitHub

Je travaillais sur un dépôt sur mon compte GitHub et c'est un problème sur lequel je suis tombé.

  • Projet Node.js avec un dossier avec quelques paquets npm installés
  • Les colis étaient en node_modules dossier
  • J'ai ajouté ce dossier au dépôt git et j'ai poussé le code sur github (je ne pensais pas à la partie npm à ce moment-là).
  • J'ai réalisé que vous n'avez pas vraiment besoin de ce dossier pour faire partie du code.
  • J'ai supprimé ce dossier, je l'ai poussé

À ce moment-là, la taille de l'ensemble du dépôt git était d'environ 6MB où le code réel (tout sauf ce dossier) n'était qu'à peu près 300 KB .

Ce que je cherche en fin de compte, c'est un moyen de se débarrasser des détails de ce dossier de paquets dans l'historique de git, de sorte que si quelqu'un le clone, il n'ait pas à télécharger 6 Mo d'historique alors que les seuls fichiers réels qu'il obtiendra à partir du dernier commit seront de 300 Ko.

J'ai cherché des solutions possibles pour cela et j'ai essayé les 2 méthodes suivantes

Le Gist semblait fonctionner où après avoir exécuté le script, il a montré qu'il s'est débarrassé de ce dossier et après cela, il a montré que 50 commits différents ont été modifiés. Mais il ne m'a pas laissé pousser ce code. Lorsque j'ai essayé de le pousser, il a dit Branch up to date mais a montré que 50 commits ont été modifiés lors d'une git status . Les deux autres méthodes n'ont pas aidé non plus.

Maintenant, même s'il a montré qu'il s'est débarrassé de l'historique de ce dossier, lorsque j'ai vérifié la taille de ce repo sur mon hôte local, il était toujours autour de 6 Mo. (J'ai également supprimé le refs/original mais n'a pas vu le changement dans la taille du repo).

Ce que je cherche à clarifier, c'est s'il y a un moyen de se débarrasser non seulement de l'historique des commits (qui est la seule chose que je pense qui s'est produite) mais aussi de ces fichiers que git conserve en supposant que l'on veuille faire un retour en arrière.

Supposons qu'une solution soit présentée et appliquée sur mon hôte local mais qu'elle ne puisse pas être reproduite sur ce dépôt GitHub, est-il possible de cloner ce dépôt, de revenir au premier commit et de le pousser (ou cela signifie-t-il que git aura toujours un historique de tous ces commits ? - aka. 6MB).

Mon objectif final ici est de trouver la meilleure façon de se débarrasser du contenu du dossier dans git afin qu'un utilisateur n'ait pas à télécharger 6MB de matériel et qu'il puisse toujours avoir les autres commits qui n'ont jamais touché le dossier des modules (c'est à peu près tout) dans l'historique de git.

Comment puis-je le faire ?

4 votes

Si l'une des réponses ci-dessous a résolu votre problème, vous devriez peut-être envisager d'en accepter une comme réponse à votre question. meta.stackexchange.com/questions/5234/

0 votes

La meilleure réponse est : stackoverflow.com/a/32886427/5973334

21voto

Joseph DeCarlo Points 2093

Cet article l'explique très bien : http://git-scm.com/book/en/Git-Internals-Maintenance-and-Data-Recovery

Gardez à l'esprit que lorsque vous faites quelque chose comme ça, cela réécrit l'historique entier.

8voto

jgbarah Points 113

Recette complète de copier-coller, j'ai juste ajouté les commandes dans les commentaires (pour la solution de copier-coller), après les avoir testées :

git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD
echo node_modules/ >> .gitignore
git add .gitignore
git commit -m 'Removing node_modules from git history'
git gc
git push origin master --force

Après cela, vous pouvez supprimer la ligne "node_modules/" de .gitignore

0 votes

Pourquoi alors supprimer node_modules de .gitignore ? Pour qu'ils puissent être à nouveau commis accidentellement ? ?

1 votes

Il n'est pas supprimé de gitignore, il est ajouté à gitignore. Le message de livraison dit "git history", pas "gitignore" :)

1 votes

Mais le commentaire dit que vous pouvez ensuite supprimer node_modules de .gitignore .

8voto

Uwe Points 471

Pour les utilisateurs de Windows, veuillez noter qu'il faut utiliser " au lieu de ' Ont également été ajoutés -f pour forcer la commande si une autre sauvegarde est déjà présente.

git filter-branch -f --tree-filter "rm -rf FOLDERNAME" --prune-empty HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
echo FOLDERNAME/ >> .gitignore
git add .gitignore
git commit -m "Removing FOLDERNAME from git history"
git gc
git push origin master --force

3voto

LordObi Points 96

J'ai supprimé les dossiers bin et obj d'anciens projets C# utilisant git sous Windows. Soyez prudent avec

git filter-branch --tree-filter "rm -rf bin" --prune-empty HEAD

Il détruit l'intégrité de l'installation de git en supprimant le dossier usr/bin dans le dossier d'installation de git.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X