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

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

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

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

Невозможно создать новую резервную копию. Предыдущая резервная копия уже существует в refs / original /
Принудительно перезаписать резервную копию с помощью -f
rm: невозможно удалить /.git-rewrite/backup-refs: разрешение отказано
rm: невозможно удалить каталог /.git -rewrite: каталог не пустой

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

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

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


person Cardin    schedule 19.06.2011    source источник
comment
Для поисковых систем: это также может относиться к вашему сообщению об ошибке .git-rewrite already exists, please remove it.   -  person Drew Noakes    schedule 19.06.2015


Ответы (4)


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

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

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
person knittl    schedule 19.06.2011
comment
Наконец-то он заработал, спасибо! Я пробовал использовать флаг -f, но проблема заключалась в том, что я помещал его в конец команды, например. ГОЛОВА -f. Увидев вашу команду, я попытался поставить флаг в начале, и это сработало! = D - person Cardin; 20.06.2011
comment
флаги опций (-f) идут перед ссылками (HEAD). рефери идут последними - person knittl; 20.06.2011
comment
Я все еще получаю ту же ошибку после добавления -f И удаления каталога. Любые идеи? - person Yaron; 24.04.2015
comment
@Yaron: какая ошибка? git add не появляется в моем ответе. - person knittl; 24.04.2015
comment
@knittl, я не имел в виду git add. Я получал ту же ошибку, что и исходный плакат, даже после удаления папки .git/refs/original/ и использования флага -f в команде git filter-branch. В моем случае решением было удалить файл .git/packed-refs. - person Yaron; 25.04.2015
comment
@Yaron: packed-refs содержит все ссылки. Возможно, вы удалили много важных ссылок. - person knittl; 26.04.2015
comment
У меня такая же проблема с разрешениями, даже если я сделал filter-branch в первый раз! Любые идеи? Репозиторий был фактически скопирован (получен) из удаленного репозитория. - person Gabrielius; 04.11.2015
comment
@Gabrielius: правильны ли права доступа к файлам и каталогам в вашем репозитории? Можете ли вы писать на свой диск, доступно ли место на диске? Также убедитесь, что каталог .git-rewrite не существует. - person knittl; 05.11.2015
comment
@knittl, нашел как исправить, но не нашел в чем проблема. По сути, я добавил --ignore-unmatch к команде git rm, и все прошло гладко! - person Gabrielius; 12.11.2015
comment
@Gabrielius: это уже содержится в моем ответе с 2012 года? :) - person knittl; 13.11.2015
comment
@knittl, да, забавно. Проблема началась, когда я удалил --ignore-unmatch, потому что с ним ничего не удалялось, но потом появилась эта ошибка разрешений. Затем я повторно добавил параметр, но на этот раз использовал его с другим путем. Таким образом, настоящая проблема заключалась в неправильном пути :) - person Gabrielius; 13.11.2015
comment
Удаление .git/refs/original/ не решило мою проблему. Я восстановил папку, а затем использовал этот ответ, чтобы удалить резервную копию. - person Erik Koopmans; 01.05.2018

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

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

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

person k06a    schedule 09.12.2015
comment
Это правильное решение для удаления бэкапа! Удаление .git/refs/original/ не решает проблемы. - person Erik Koopmans; 01.05.2018
comment
Обязательно замените master на ветку, которую вы пытаетесь исправить ... в моем случае "develop" - person Damian Green; 14.05.2018
comment
git show-ref | awk '/ refs.original.refs/{print$2}', чтобы найти все резервные копии вашего репо. - person Dan; 05.07.2020

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

person Yaron    schedule 23.04.2015
comment
Та же проблема. Однако ни .git/packed-refs файл, ни папка original в .git/refs. Кто-нибудь? - person XedinUnknown; 25.06.2015
comment
Решено здесь путем добавления флага -r в команду. - person XedinUnknown; 25.06.2015
comment
Здесь та же проблема. Удаление упакованных ссылок решило проблему, но также испортило остальную часть моего каталога git, и мне пришлось восстанавливать из резервной копии. - person Kevin Yin; 06.04.2017

Добавьте силу к команде ветвления фильтра.

person Adam Dymitruk    schedule 19.06.2011