Какая хэш-функция используется в Git для идентификации объектов?

«Какая хэш-функция используется в Git для идентификации объектов?» — вопрос из категории Git, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Git для идентификации объектов (коммитов, деревьев, файлов-блобов, тегов) исторически использовал криптографическую хэш-функцию SHA-1, которая генерирует 40-символьный шестнадцатеричный хэш (например, a1b2c3d...).

Почему это важно в контексте DevOps:

  • Целостность данных: Любое минимальное изменение в содержимом объекта приводит к совершенно другому хэшу. Это гарантирует, что история репозитория не может быть незаметно изменена.
  • Адресация содержимым (Content-addressable storage): Имя файла в .git/objects — это его хэш. Это эффективная дедупликация: одинаковые файлы хранятся один раз.

Переход на SHA-256: Из-за теоретических уязвимостей SHA-1, начиная с Git версии 2.29 (2020 г.), ведется работа по поддержке более безопасного алгоритма SHA-256. Новые репозитории можно инициализировать с git init --object-format=sha256. Однако подавляющее большинство существующих репозиториев и инструментов (GitHub, GitLab) все еще используют SHA-1.

На практике DevOps-инженер сталкивается с этим при:

  • Анализе логов CI/CD, где фигурируют хэши коммитов.
  • Настройке хуков (hooks), которые проверяют хэши.
  • Поиске причин рассинхронизации в сложных рабочих процессах (например, при использовании Git Submodules или многорепозиторной структуре).