Ошибка очистки файла из репозитория Git, невозможно создать новую резервную копию


117

Я попытался удалить файл из удаленного репо, выполнив:

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

Но Git жалуется, что

Невозможно создать новую резервную копию. Предыдущая резервная копия уже существует в refs / original /
Принудительно перезаписывает резервную копию с помощью -f
rm: невозможно удалить /.git-rewrite/backup-refs: Permission denied
rm: cannot remove directory /.git-rewrite: Directory not empty

Это было после того, как я уже удалил каталог .git-rewrite в Windows.

Как мне удалить этот файл? Это файл размером 29 Мбайт, который находится в моем репозитории, поэтому мне совершенно необходимо его удалить.

Я попытался удалить фиксацию git rebase -i, но, видимо, поскольку фиксация затронула много разных файлов, Git жалуется на конфликты, и я прервался, чтобы быть в безопасности.


1
Для поисковых систем: это также может относиться к вашему сообщению об ошибке .git-rewrite already exists, please remove it.
Дрю Ноукс

Ответы:


220

Вы уже выполнили операцию ветвления фильтра. После filter-branch Git хранит ссылки на старые коммиты на случай, если что-то пойдет не так.

Вы можете найти их в .git/refs/original/…. Либо удалите этот каталог и все файлы в нем, либо используйте -fфлаг, чтобы заставить Git удалить старые ссылки.

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

10
Наконец-то заработал, спасибо! Я пробовал использовать флаг -f, но проблема заключалась в том, что я помещал его в конец команды, например. ГОЛОВА -f. Увидев вашу команду, я попытался поставить флаг в начале, и это сработало! = D
Cardin

12
option flags ( -f) идет перед refs ( HEAD). рефери идут последними
knittl

Я все еще получаю ту же ошибку после добавления -f И удаления каталога. Любые идеи?
Ярон

1
@knittl, я не имел в виду git add. Я получал ту же ошибку, что и исходный плакат, даже после удаления .git/refs/original/папки и использования -fфлага в git filter-branchкоманде. В моем случае решение было удалить .git/packed-refsфайл.
Ярон

1
@knittl, нашел как исправить, но не нашел в чем проблема. В общем, я добавил --ignore-unmatchв команду, git rmи все прошло гладко!
Габриелиус

21

Используйте эту команду для удаления исходной резервной копии:

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

Вот суть, которую я использовал для фильтрации моего репозитория git: https://gist.github.com/k06a/25a0214c98bc19fd6817


Это правильное решение для удаления бэкапа! Удаление .git/refs/original/не решает проблему.
Эрик Купманс

Обязательно замените «master» на ветку, которую вы пытаетесь исправить .. в моем случае «разработка»
Дамиан Грин

git show-ref | awk '/ refs.original.refs/{print$2}'чтобы найти все резервные копии вашего репо.
Дэн

4

У меня была та же проблема, и ответ выше не помог. Не осталось каталога .git / refs / original /. Решением для меня было удаление файла .git / pack-refs.


Та же проблема. Однако ни .git/packed-refsфайла, ни папки originalв .git/refs. Кто угодно?
XedinUnknown

Решено здесь добавлением -rфлага к команде.
XedinUnknown

Здесь та же проблема. Удаление pack-refs решило проблему, но также испортило остальную часть моего каталога git, и мне пришлось восстанавливать из резервной копии.
Кевин Инь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.