Удалить большой файл из нескольких коммитов назад (в git)

5450
Gentatsu

Я сделал несколько локальных коммитов для своей кодовой базы и попытался перенести ее в репо, но там было довольно много больших файлов. Я просто сдался и продолжал работать, делая местные коммиты. Я удалил большие файлы сейчас и зафиксировал снова, но он все еще пытается выдвинуть оригинальные большие файлы. Я попытался добавить gitignore после того, как я зафиксировал их изначально, чтобы игнорировать любой файл размером более 50 МБ, но безрезультатно.

Есть идеи?

6

1 ответ на вопрос

10
ladorm

Читайте здесь про фильтр-ветку.

Кто-то случайно фиксирует огромный бинарный файл с бездумным добавлением git, и вы хотите удалить его везде. Возможно, вы случайно зафиксировали файл, содержащий пароль, и хотите сделать свой проект открытым исходным кодом. filter-branch - это инструмент, который вы, вероятно, хотите использовать для очистки всей своей истории. Чтобы удалить файл с именем passwords.txt из всей истории, вы можете использовать опцию --tree-filter для filter-branch:

$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21) Ref 'refs/heads/master' was rewritten 

Вы также можете сделать интерактивную перебазирование в свою ветку в тот момент, когда вы зафиксировали эти файлы, и удалить их из этого коммита. Ссылка выше также объясняет это, но в основном:

git rebase -i HEAD~X 

позволит вам редактировать последние X коммитов.

У меня довольно много больших файлов, и кажется, что это займет некоторое время. Gentatsu 7 лет назад 0
Я предполагаю, что вы имеете в виду с ответвлением фильтра из-за нескольких файлов. Не можете ли вы использовать регулярное выражение, чтобы добраться до них всех? Тогда, возможно, второй вариант (перебазирование) проще, потому что вы можете перейти к этому коммиту и удалить файлы из системы так же, как вы их удалили заново ladorm 7 лет назад 0
Разве это не повлияет на мои текущие файлы? Не изменятся ли они тоже, или мне придется их объединить? Gentatsu 7 лет назад 0
Если вы не трогаете свои файлы, они не изменятся. Повторная версия возвращает ваши файлы в историю до момента этого коммита и начинает повторное применение ваших коммитов. Он останавливается на коммите, который вы пометили для редактирования. При этом коммите вы должны удалить эти файлы, а затем зафиксировать с помощью 'git commit --ammend' (по ссылке, которую я вам дал). Это изменяет ваш коммит, а затем вы возобновляете ребаз, и он начинает применять остальные ваши коммиты. ladorm 7 лет назад 0
Забыли об этом! Я сделал ребаз и просто раздавил все свои коммиты, которые включали новый файл игнорирования, и это сработало. Gentatsu 5 лет назад 0

Похожие вопросы