Je travaillais sur un référentiel sur mon compte GitHub et c'est un problème sur lequel je suis tombé.
- Projet Node.js avec un dossier avec quelques packages npm installés
- Les packages étaient dans le
node_modules
dossier - Ajout de ce dossier au dépôt git et transmission du code à github (ne pensait pas à la partie npm à l'époque)
- Réalisé que vous n'avez pas vraiment besoin de ce dossier pour faire partie du code
- Supprimé ce dossier, poussé
Dans ce cas, la taille du dépôt git total était d'environ 6 Mo, où le code réel (tous sauf ce dossier) n'était que d'environ 300 Ko .
Maintenant, ce que je recherche à la fin est un moyen de se débarrasser des détails de ce dossier de package de l'historique de git, donc si quelqu'un le clone, il n'a pas besoin de télécharger 6 Mo d'historique où les seuls fichiers réels qu'ils obtiendront au dernier commit serait de 300 Ko.
J'ai recherché des solutions possibles pour cela et j'ai essayé ces 2 méthodes
- Supprimer le fichier du référentiel git (historique)
- http://help.github.com/remove-sensitive-data/
- https://gist.github.com/1588371
The Gist semblait avoir fonctionné où, après avoir exécuté le script, il a montré qu'il s'était débarrassé de ce dossier et après cela, il a montré que 50 validations différentes ont été modifiées. Mais cela ne m'a pas permis de pousser ce code. Quand j'ai essayé de le pousser, il a dit Branch up to date
mais a montré que 50 commits ont été modifiés sur a git status
. Les 2 autres méthodes n'ont pas aidé non plus.
Maintenant, même s'il a montré qu'il s'était débarrassé de l'historique de ce dossier, lorsque j'ai vérifié la taille de ce dépôt sur mon hôte local, il était toujours d'environ 6 Mo. (J'ai également supprimé le refs/original
dossier mais je n'ai pas vu le changement dans la taille du dépôt).
Ce que je cherche à clarifier, c'est s'il existe un moyen de se débarrasser non seulement de l'historique des validations (qui est la seule chose qui, selon moi, s'est produite), mais aussi de ces fichiers que git continue de supposer que l'on veut annuler.
Disons qu'une solution est présentée pour cela et est appliquée sur mon hôte local mais ne peut pas être reproduite sur ce repo GitHub, est-il possible de cloner ce repo, de revenir au premier commit d'effectuer l'astuce et de le pousser (ou cela signifie-t-il que git ont encore un historique de tous ces commits? - alias. 6 Mo).
Mon objectif final ici est de trouver fondamentalement la meilleure façon de se débarrasser du contenu du dossier de git afin qu'un utilisateur n'ait pas à télécharger 6 Mo de trucs et ait éventuellement les autres validations qui n'ont jamais touché le dossier des modules (c'est assez presque tous) dans l'histoire de git.
Comment puis-je faire ceci?
la source
Réponses:
Si vous êtes ici pour copier-coller du code:
Ceci est un exemple qui supprime
node_modules
de l'histoireCe que fait git:
La première ligne parcourt toutes les références de la même arborescence (
--tree-filter
) que HEAD (votre branche actuelle), en exécutant la commanderm -rf node_modules
. Cette commande supprime le dossier node_modules (-r
, sans-r
,rm
ne supprimera pas les dossiers), sans invite à l'utilisateur (-f
). L'ajout--prune-empty
supprime inutile (ne change rien) commet récursivement.La deuxième ligne supprime la référence à cette ancienne branche.
Les autres commandes sont relativement simples.
la source
git count-objects -v
de vérifier si les fichiers ont été réellement supprimés mais la taille du référentiel reste la même jusqu'à ce que je clone à nouveau le référentiel. Git conserve une copie de tous les fichiers originaux, je pense.--force-with-lease
, non--force
.Je trouve que l'
--tree-filter
option utilisée dans d'autres réponses peut être très lente, en particulier sur les grands référentiels avec beaucoup de commits.Voici la méthode que j'utilise pour supprimer complètement un répertoire de l'historique git en utilisant l'
--index-filter
option, qui s'exécute beaucoup plus rapidement:Vous pouvez vérifier la taille du référentiel avant et après
gc
avec:la source
--quiet
à ce quigit rm
précède a accéléré ma réécriture au moins par le facteur 4.En plus de la réponse populaire ci-dessus, je voudrais ajouter quelques notes pour les systèmes Windows . La commande
fonctionne parfaitement sans aucune modification! Par conséquent, vous ne devez pas utiliser
Remove-Item
,del
ni rien d'autre à la place derm -rf
.Si vous devez spécifier un chemin vers un fichier ou un répertoire, utilisez des barres obliques comme
./path/to/node_modules
la source
La méthode la meilleure et la plus précise que j'ai trouvée était de télécharger le fichier bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
Exécutez ensuite les commandes:
Si vous souhaitez supprimer des fichiers, utilisez plutôt l'option delete-files:
la source
Il semble que la réponse à jour à cela soit de ne pas utiliser
filter-branch
directement (au moins git lui-même ne le recommande plus) et de reporter ce travail à un outil externe. En particulier, git-filter-repo est actuellement recommandé. L'auteur de cet outil fournit des arguments sur pourquoi l' utilisationfilter-branch
peut directement conduire à des problèmes.La plupart des scripts multi-lignes ci-dessus à supprimer
dir
de l'historique peuvent être réécrits comme suit:Apparemment, l'outil est plus puissant que cela. Vous pouvez appliquer des filtres par auteur, e-mail, nom de référence, etc. ( page de manuel complète ici ). De plus, c'est rapide . L'installation est facile - elle est distribuée dans une variété de formats .
la source
pip3 install git-filter-repo
car il est uniquement compatible avec stdlib et n'installe aucune dépendance. Sur Ubuntu 18, il est incompatible avec la version git de la distributionError: need a version of git whose diff-tree command has the --combined-all-paths option
, mais il est assez facile de l'exécuter sur undocker run -ti ubuntu:20.04
Complétez la recette copier-coller, en ajoutant simplement les commandes dans les commentaires (pour la solution copier-coller), après les avoir testées:
Après cela, vous pouvez supprimer la ligne "node_modules /" de .gitignore
la source
node_modules
de.gitignore
? Pour qu'ils puissent à nouveau être accidentellement commis ??node_modules
de.gitignore
.Pour les utilisateurs de Windows, veuillez noter d'utiliser
"
au lieu de'
Aussi ajouté-f
pour forcer la commande si une autre sauvegarde est déjà là.la source
J'ai supprimé les dossiers bin et obj des anciens projets C # en utilisant git sur windows. Attention à
Il détruit l'intégrité de l'installation de git en supprimant le dossier usr / bin dans le dossier d'installation de git.
la source