Git: Как удалить файл из исторической фиксации?

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

Ответ 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

Ответ 2

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

Если ваша фиксация находится в HEAD минус 10 коммитов:

$ git rebase -i HEAD~10

После издания вашей истории вам нужно нажать "новую" историю, вам нужно добавить + для принудительного (см. refspec в нажмите опции):

$ git push origin +master

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

Ответ 3

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

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