Описание тега git-rewrite-history

Перезапись истории репозитория Git, например, для редактирования старых коммитов, удаления нежелательных данных (например, личных данных или больших файлов), изменения структуры файлов, исправления метаданных коммитов и т. Д.

У желания переписать историю Git есть много причин:

  • Исправление старого коммита
  • Уменьшение размера репозитория за счет удаления больших файлов, ранее зарегистрированных в репо - они по-прежнему занимают дисковое пространство, даже если их удалить из последующих коммитов
  • Удаление конфиденциальных данных (пароли, учетные данные и т. Д.), Которыми вы не хотели бы делиться при совместном использовании репо, или даже просто перемещение репо к внешнему хостинг-провайдеру
  • Переупорядочивание или удаление целых папок, чтобы отразить разделение многих подпроектов из одного репо на множество или наоборот

Репозитории Git хранят всю историю проекта, и по замыслу коммиты Git неизменяемы (их идентификатор полностью меняется, если изменяется даже небольшая часть их содержимого или истории) - так как же удалить нежелательные данные, хранящиеся глубоко в прошлом вашего репозитория?

Инструменты для переписывания истории

Изменение истории в репозитории Git означает переписывание всей последующей истории коммитов с этого момента. Есть несколько инструментов, позволяющих это сделать:

  • git commit --amend - для исправления последней сделанной вами фиксации.
  • git rebase для перебазирования истории ветки, воспроизводя ее так, как будто все это основано на другой (часто более новой) точке в истории репозитория. Используется с-i флаг, может использоваться для интерактивного изменения порядка истории.
  • git filter-branch - автоматизированный инструмент для перезаписи множества коммитов (во многих ветвях) с использованием одного или нескольких сценариев оболочки для внесения изменений, что придает ему большую гибкость.
  • BFG Repo-Cleaner - альтернативаgit-filter-branchкоторый обеспечивает большую скорость и удобство использования, ограничиваясь распространенными вариантами использования, связанными с задачей удаления нежелательных данных.

Совместное использование переписанной истории

Если репозиторий был предоставлен в общий доступ до перезаписи, необходимо впоследствии отправить перезаписанную версию на главный сервер с --force или --mirror флаг, а затем попросите других пользователей повторно клонировать репозиторий.