Git: Как удалить файл из исторического коммита? - PullRequest
102 голосов
/ 05 января 2012

У меня есть фиксация с идентификатором 56f06019 (например).В этом коммите я случайно передал большой файл (50Mb).В другой коммит я добавляю тот же файл, но в нужном размере (маленький).Теперь мой репо, когда я клонирую, слишком тяжел :( Как удалить этот большой файл из истории репо, чтобы уменьшить размер моего репо?

Ответы [ 3 ]

149 голосов
/ 05 января 2012

Глава 9 книги Pro Git содержит раздел Удаление объектов .

Позвольте мне кратко изложить шаги здесь:

git filter-branch --index-filter \
    'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
    --tag-name-filter cat -- --all

Как и опция перебазирования, описанная выше, filter-branch - операция перезаписи. Если вы опубликовали историю, вам придется --force нажать на новые ссылки.

Подход filter-branch значительно мощнее, чем rebase, поскольку он

  • позволяет работать сразу на всех ветках / ссылках,
  • переименовывает любые теги на лету
  • работает корректно, даже если после добавления файла было несколько коммитов слияния
  • работает чисто, даже если файл был (повторно) добавлен / удален несколько раз в истории (а) филиала (ов)
  • не создает новые несвязанные коммиты, а копирует их, изменяя связанные с ними деревья. Это означает, что такие вещи, как подписанные коммиты, примечания о коммитах и ​​т. Д., Сохраняются

filter-branch также хранит резервные копии, поэтому размер репо не уменьшится сразу, если не истечет время повторного хранения и сбора мусора:

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger
4 голосов
/ 11 апреля 2017

Вы можете использовать git-extras tool. Команда obliterate полностью удаляет файл из хранилища, включая последние коммиты и теги.

https://github.com/tj/git-extras/blob/master/Commands.md

1 голос
/ 05 января 2012

Вам нужно будет git rebase в интерактивном режиме, посмотрите пример здесь: Как мне удалить коммит на GitHub? и как удалить старые коммиты .

Если ваш коммит в HEAD минус 10 коммитов:

$ git rebase -i HEAD~10

После издания вашей истории вам нужно нажать «новую» историю, вам нужно добавить + к силе (см. Refspec в опциях push ):

$ git push origin +master

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...