2013-04-02 3 views
3

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

Répondre

7

je me suis retrouvé à l'aide de la BFG Repo Cleaner sur un dépôt cloné nu (clone git --mirror-url repo). Il passe par toutes les branches/étiquettes, en laissant chaque travail et il est même beaucoup plus rapide que la branche filtre. J'espère que cela aidera d'autres personnes ayant des problèmes similaires.

Voici mon script d'emballage:

#!/bin/bash 
#usage: ./remove_files.sh file_list.txt bare-repo-dir 
while read file_hash file_to_remove 
do 
    echo "Removing "$file_to_remove; 
    lastFile=`echo $file_to_remove | awk -F/ '{print $NF}'`; 
    java -jar bfg.jar --delete-files $lastFile $2; 
done < $1 

cd $2; 
git gc --prune=now --aggressive; 
cd ..; 
+1

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}' –

+0

@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

+0

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. –

Questions connexes