Wyczyszczenie pliku z repozytorium Git nie powiodło się, nie można utworzyć nowej kopii zapasowej

116

Próbowałem usunąć plik z mojego zdalnego repozytorium, uruchamiając:

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

Ale Git narzeka na to

Nie można utworzyć nowej kopii zapasowej. Poprzednia kopia zapasowa już istnieje w refs / original /
Force nadpisanie kopii zapasowej za pomocą -f
rm: nie można usunąć /.git-rewrite/backup-refs: Odmowa uprawnień
rm: nie można usunąć katalogu /.git-rewrite: Katalog nie jest pusty

To było po tym, jak już usunąłem katalog .git-rewrite w systemie Windows.

Jak mogę usunąć ten plik? Jest to plik 29 MB znajdujący się w moim repozytorium, więc muszę go usunąć.

Próbowałem usunąć zatwierdzenie w git rebase -i, ale najwyraźniej ponieważ zatwierdzenie dotknęło wielu różnych plików, Git skarży się na konflikty i przerwałem, aby być bezpiecznym.

Cardin
źródło
1
W przypadku wyszukiwarek: może to mieć również zastosowanie, gdy komunikat o błędzie to .git-rewrite already exists, please remove it.
Drew Noakes

Odpowiedzi:

219

Wykonałeś już operację rozgałęzienia filtra. Po filter-branch, Git zachowuje odniesienia do starych zatwierdzeń, na wypadek gdyby coś poszło nie tak.

Możesz je znaleźć w .git/refs/original/…. Usuń ten katalog i wszystkie znajdujące się w nim pliki lub użyj -fflagi, aby zmusić Git do usunięcia starych odniesień.

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
knittl
źródło
10
Wreszcie udało się, dzięki! Próbowałem użyć flagi -f, ale problem polegał na tym, że wstawiałem ją na końcu polecenia np. GŁOWA -f. Widząc twoje polecenie, spróbowałem umieścić flagę na początku i zadziałało! = D
Cardin
12
flagi opcji ( -f) znajdują się przed refs ( HEAD). refs go last
knittl
Nadal pojawia się ten sam błąd po dodaniu -f ORAZ usunięciu katalogu. Jakieś pomysły?
Yaron
1
@knittl, nie odnosiłem się do git add. Otrzymałem ten sam błąd, co oryginalny plakat, nawet po usunięciu .git/refs/original/folderu i użyciu -fflagi w git filter-branchpoleceniu. Rozwiązaniem w moim przypadku było usunięcie .git/packed-refspliku.
Yaron
1
@knittl, znalazłem, jak to naprawić, ale nie znalazłem w czym problem. Zasadniczo dodałem --ignore-unmatchdo polecenia git rmi poszło gładko!
Gabrielius
21

Użyj tego polecenia, aby usunąć oryginalną kopię zapasową:

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

Oto sedno, którego użyłem do filtrowania rozgałęzień mojego repozytorium git: https://gist.github.com/k06a/25a0214c98bc19fd6817

k06a
źródło
To jest właściwe rozwiązanie, aby usunąć kopię zapasową! Usunięcie .git/refs/original/nie rozwiązuje problemu.
Erik Koopmans
Pamiętaj, aby zmienić „master” na gałąź, którą próbujesz naprawić .. w moim przypadku „rozwijać”
Damian Green
git show-ref | awk '/ refs.original.refs/{print$2}'aby znaleźć wszystkie kopie zapasowe w repozytorium.
Dan
4

Miałem ten sam problem i powyższa odpowiedź go nie rozwiązała. Nie pozostał żaden katalog .git / refs / original /. Rozwiązaniem dla mnie było usunięcie pliku .git /pack-refs.

Yaron
źródło
Taki sam problem. Brak .git/packed-refspliku, jednak i nie folderu originalw .git/refs. Ktoś?
XedinUnknown
Rozwiązano tutaj , dodając -rflagę do polecenia.
XedinUnknown
Mam ten sam problem. Usunięcie spakowanych referencji rozwiązało problem, ale zrujnowało również resztę mojego katalogu git i musiałem przywrócić z kopii zapasowej.
Kevin Yin,
2

Dodaj siłę do polecenia filter branch.

Adam Dymitruk
źródło