Ответ 1
В главе 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
, поскольку он
- позволяет вам работать со всеми веткими/ссылками сразу,
- переименовывает любые теги на лету
- работает чисто, даже если с момента добавления файла было выполнено несколько слияний слияния,
- работает чисто, даже если файл был повторно добавлен/удален несколько раз в истории (a) branch (es)
- не создает новые, несвязанные коммиты, а копирует их при изменении связанных с ними деревьев. Это означает, что сохраняются такие вещи, как подписанные коммиты, фиксация заметок и т.д.
filter-branch
также сохраняет резервные копии, поэтому размер репо не будет уменьшаться немедленно, если вы не закончите сбор логов и мусора:
rm -Rf .git/refs/original # careful
git gc --aggressive --prune=now # danger