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.


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

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


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.


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,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.