Глава 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