В главе 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