J'ai récemment cloné un référentiel SVN qui contenait quelques binaires, qui ne sont plus nécessaires. Malheureusement, je l'ai déjà poussé à Github avec les binaires inclus. Je veux maintenant les supprimer en utilisant 'git filter-branch' mais je suis confronté à quelques problèmes quand il s'agit de balises et de branches.Suppression des fichiers indésirables de l'historique, y compris toutes les références avec la branche de filtre
Fondamentalement, j'ai créé un script shell simple pour supprimer une liste des fichiers qui ont été déterminées par la commande suivante:
git rev-list --objects --all | grep .jar > files.txt
Le script pour l'enlèvement se présente comme suit:
#!/bin/sh
while read file_hash file_to_remove
do
echo "Removing "$file_to_remove;
git filter-branch --index-filter "git rm --cached --ignore-unmatch $file_to_remove"
rm -rf .git/refs/original/;
git reflog expire --all --expire-unreachable=0;
git repack -A -d;
git prune
done < $1
J'ai quelques balises (toutes listées dans .git/packed-refs), un .git/refs/remotes/origin (pointant vers le repo Github). La suppression des fichiers en utilisant le script ci-dessus n'a pas l'effet voulu ('du -cm' reste pour afficher la même taille, 'git rev-list' répertorie toujours les fichiers) jusqu'à ce que je supprime manuellement toutes les références de .git/packed -refs et le répertoire .git/refs/remotes/origin.
Naturellement, je perds tous les tags ainsi que la possibilité de ramener mes modifications locales à Github avec cette approche. Y at-il quelque chose que j'ai manqué ou existe-t-il un autre moyen de supprimer des fichiers de toutes les branches/étiquettes sans détruire mon historique?
Un grand merci à l'avance, Matthes
Très heureux vous aimez le @matthes outil! Par intérêt, combien de fichiers différents avez-vous besoin de supprimer? Le commutateur "--delete-files" accepte les expressions de globes, et en général il est préférable de ne faire qu'une seule grande partie de BFG. Par exemple: '--delete-files *. {Xml, exe}' –
@Roberto: bon indice. en effet, j'ai seulement enlevé (une énorme liste de) fichiers .jar du repo à la fin. Donc je suppose que faire via "--delete-files * .jar" aurait été encore plus rapide (et plus sûr aussi?) – matthes
Yup, "--delete-files * .jar" ferait l'affaire! (ou bien quelque chose comme "--strip-blobs-plus-que-512K"). Le BFG met également à jour tous les identifiants de validation qu'il trouve dans vos messages de validation, donc c'est bien de ne le faire qu'une seule fois. Quelle que soit l'approche adoptée, le BFG s'assure qu'il ne supprime rien de votre dernière validation, donc les fichiers que vous utilisez ne seront pas supprimés. –