Что произойдет, если две записи Git имеют один и тот же SHA-1 хэш?

Позвольте мне префикс этого, сказав, что я знаю чрезвычайно незначительные шансы на это. Я знаю, что было бы более или менее невозможно изготовить и вряд ли произойдет "в дикой природе". Это просто вопрос "что-если" о внутренних элементах Git.

Итак, вот мой вопрос: что произойдет, если две хэш-коды Git будут идентичны? Для начала:

  • Будет ли фиксация успешной?
  • Может ли это быть позже проверено как отдельная голова?
  • Возможна ли последующая фиксация?

Ответ 1

Мой старый ответ Как бы git обрабатывать конфликт SHA-1 на blob?" все равно будет применяться даже для фиксации, а не для blob.
Поскольку torek упоминает в комментариях, git просто думает обо всем как о "объектах", каждый с их собственным SHA1.

https:// git -scm.com/book/en/v2/book/10-git-internals/images/data-model-4.png

(Изображение из Git Внутренние - git Ссылки главы ProGit Book v2)

Хотя фиксация, вероятно, не будет выполнена (есть несколько проверок в git-commit-tree.c), вам также необходимо рассмотреть случай где два фиксации с одним и тем же SHA1 (и каким-то другим контентом) создаются в репозиториях A и B... и репо A извлекает репо B!
Commit 8685da4 (март 2007, git 1.5.1) позаботился об этом, и выборка завершилась неудачно.
Commit 0e8189e (октябрь 2008 г., git 1.6.1) упоминает, что с index V2:

коэффициенты для ссылки SHA1 для получения повреждения, поэтому он фактически соответствует SHA1 другого объекта с одинаковым размером (заголовок треугольника хранит ожидаемый размер базового объекта, который применяется против) практически равен нулю.

Он все еще реализует проверку CRC упакованного объекта при распаковке объектов.