Как мне полностью уничтожить файл из git-репо?

Я случайно отправил файл, на который у меня нет прав, в общедоступном репо.

Что я могу сделать, чтобы выборочно уничтожить этот единственный файл из репозитория, чтобы его данные полностью исчезли?

2 ответа

Решение

Git Filter-Branch - ваш друг в этом деле, хорошо задокументированный прекрасным Github

Предполагая, что коммит, в который вы добавили файл, является самым последним:

git reset --hard HEAD^
git push --force

Если у вас есть больше коммитов в репозитории, вы можете использовать интерактивное перебазирование, чтобы стереть этот коммит. использование git rebase -i xxx с xxx быть коммитом перед тем, кого вы хотите уничтожить. Затем в редакторе удалите строку, содержащую "плохой" коммит. Как только вы сохраните и выйдите из редактора, эта фиксация исчезнет навсегда. Если вы не можете удалить весь коммит, вы можете заменить pick с edit в файле и измените коммит (например, удалите файл из промежуточной области), а затем запустите git rebase --continue

Тем не менее, каждый, кто вытащил из вашего репо, должен будет выполнить тот же ребаз вручную. Но тогда этот файл в любом случае уже открыт, и вам не нужно переписывать историю, чтобы исправить свою ошибку.

Вместо всех перебазировок вы также можете использовать git-filter-branch чтобы удалить файл, описанный в справке GitHub:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch NAME_OF_THE_FILE' --prune-empty -- --all

Конечно надо git push --force после этой операции тоже, поскольку она также переписывает историю (со всеми предостережениями, если кто-то извлечет из этого хранилища и начнет работать над ним). Если ваш репозиторий находится на github, также не забудьте связаться с ним, чтобы очистить кеш вашего репозитория.

Другие вопросы по тегам