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

Есть много мотивов для того, чтобы переписать историю Git:

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

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

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

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

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

Обмен переписанной историей

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