Хэширование коммита

Как хэшируется коммит? Для хэширования коммита используется название этого коммита или может дата?


Ответы (2 шт):

Автор решения: gbg

В хэш записывается много-много всяких параметров

  • автор
  • кто закоммитил
  • хэш родительского коммита (получается такой себе блокчейн - нельзя без перетряхивания всей репы подменить один файл)
  • хэш от дерева данного коммита, который в свою очередь составлен из хешей всех блобов и поддеревьев
  • хэш от текста описания коммита
→ Ссылка
Автор решения: aleksandr barakin

всю информацию, которую содержит объект, можно посмотреть такой командой:

$ git cat-file тип-объекта хэш-объекта

к примеру, для объекта типа commit с хэшем 3cbc0fb39c84ae0a51a9a88649dccd105bf17d6e:

$ git cat-file commit 3cbc0fb39c84ae0a51a9a88649dccd105bf17d6e
tree 71173edd7df0127465dcec352cf76c90cbf1e446
parent fc36b97af05ef74b0889ba49090c2f52f00e0e77
author Harald Anlauf <[email protected]> 1593262593 +0200
committer Harald Anlauf <[email protected]> 1593262648 +0200

PR fortran/95881 - ICE in resolve_symbol, at fortran/resolve.c:15175

Avoid NULL pointer dereference.

gcc/fortran/
    PR fortran/95881
    * resolve.c (resolve_symbol): Avoid NULL pointer dereference.

здесь:

  • tree хэш — хэш-сумма объекта типа tree
  • parent хэш — хэш-сумма объекта типа commit, «родителя» данного коммита
  • author ..., committer ... — в пояснениях не нуждается. обратите внимание: в этих полях присутствует в том числе и время (указанное соответственно автором и коммитером: это могут быть разные лица)
  • дальше текст сообщения, прикреплённого к коммиту

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


хэш (sha1-сумма) высчитывается от такой информации:

тип-объекта длина-объекта\0содержимое-объекта

для приведённого выше примера можно пересчитать хэш таким вот образом:

$ (printf "commit %s\0" $(git cat-file commit 3cbc0fb39 | wc -c); git cat-file commit 3cbc0fb39) | sha1sum 
3cbc0fb39c84ae0a51a9a88649dccd105bf17d6e  -

хэш получился идентичный.

→ Ссылка