Échec de la purge du fichier du référentiel Git, impossible de créer une nouvelle sauvegarde

116

J'ai essayé de supprimer un fichier de mon dépôt distant en exécutant:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

Mais Git se plaint que

Impossible de créer une nouvelle sauvegarde. Une sauvegarde précédente existe déjà dans refs / original /
Force l'écrasement de la sauvegarde avec -f
rm: impossible de supprimer /.git-rewrite/backup-refs: Autorisation refusée
rm: impossible de supprimer le répertoire /.git-rewrite: Répertoire non vide

C'était après avoir déjà supprimé le répertoire .git-rewrite sous Windows.

Comment puis-je supprimer ce fichier? C'est un fichier de 29 Mo assis sur mon dépôt, donc j'ai tout à fait besoin de supprimer le fichier.

J'ai essayé de supprimer le commit dans git rebase -i, mais apparemment parce que le commit a touché beaucoup de fichiers différents, Git se plaint de conflits et j'ai abandonné pour être sûr.

Cardin
la source
1
Pour les moteurs de recherche: cela peut également s'appliquer lorsque votre message d'erreur est .git-rewrite already exists, please remove it.
Drew Noakes

Réponses:

219

Vous avez déjà effectué une opération de branchement de filtre. Après filter-branch, Git conserve les références des anciens commits, au cas où quelque chose ne va pas.

Vous pouvez les trouver dans .git/refs/original/…. Supprimez ce répertoire et tous les fichiers qu'il contient, ou utilisez l' -findicateur pour forcer Git à supprimer les anciennes références.

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
tricot
la source
10
Enfin réussi, merci! J'ai essayé le drapeau -f, mais le problème était que je le mettais à la fin de la commande, par exemple. HEAD -f. Voir votre commande m'a fait essayer de mettre le drapeau au début, et ça a marché! = D
Cardin
12
Les options flags ( -f) précèdent les refs ( HEAD). les arbitres vont en dernier
knittl
J'obtiens toujours la même erreur après avoir ajouté -f ET supprimé le répertoire. Des idées?
Yaron
1
@knittl, je ne parlais pas git add. Je recevais la même erreur que l'affiche originale même après avoir supprimé le .git/refs/original/dossier et utilisé le -fdrapeau dans la git filter-branchcommande. La solution, dans mon cas, était de supprimer le .git/packed-refsfichier.
Yaron
1
@knittl, j'ai trouvé comment le résoudre, mais je n'ai pas trouvé quel était le problème. En gros, j'ai ajouté --ignore-unmatchà la commande git rmet ça s'est bien passé!
Gabrielius
21

Utilisez cette commande pour supprimer la sauvegarde d'origine:

git update-ref -d refs/original/refs/heads/master

Voici l'essentiel que j'ai utilisé pour filtrer mon dépôt git: https://gist.github.com/k06a/25a0214c98bc19fd6817

k06a
la source
C'est la bonne solution pour supprimer la sauvegarde! La suppression .git/refs/original/ne résout pas le problème.
Erik Koopmans
Assurez-vous de remplacer «maître» par la branche que vous essayez de corriger .. dans mon cas, «développer»
Damian Green
git show-ref | awk '/ refs.original.refs/{print$2}'pour trouver toutes les sauvegardes de votre dépôt.
Dan
4

J'ai eu le même problème et la réponse ci-dessus ne l'a pas résolu. Il n'y avait plus de répertoire .git / refs / original /. La solution pour moi a été de supprimer le fichier .git / compressé-refs.

Yaron
la source
Même problème. Aucun .git/packed-refsfichier, cependant, et aucun dossier originalau format .git/refs. N'importe qui?
XedinUnknown le
Résolu ici en ajoutant l' -rindicateur à la commande.
XedinUnknown le
Même problème ici. La suppression des références emballées a résolu le problème, mais cela a également ruiné le reste de mon répertoire git, et j'ai dû restaurer à partir d'une sauvegarde.
Kevin Yin
2

Ajoutez une force à la commande de branche de filtre.

Adam Dymitruk
la source