Описание тега 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
флаг, а затем попросите других пользователей повторно клонировать репозиторий.