Хэширование коммита
Как хэшируется коммит? Для хэширования коммита используется название этого коммита или может дата?
Ответы (2 шт):
В хэш записывается много-много всяких параметров
- автор
- кто закоммитил
- хэш родительского коммита (получается такой себе блокчейн - нельзя без перетряхивания всей репы подменить один файл)
- хэш от дерева данного коммита, который в свою очередь составлен из хешей всех блобов и поддеревьев
- хэш от текста описания коммита
всю информацию, которую содержит объект, можно посмотреть такой командой:
$ 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 хэш— хэш-сумма объекта типа treeparent хэш— хэш-сумма объекта типа commit, «родителя» данного коммитаauthor ...,committer ...— в пояснениях не нуждается. обратите внимание: в этих полях присутствует в том числе и время (указанное соответственно автором и коммитером: это могут быть разные лица)- дальше текст сообщения, прикреплённого к коммиту
это пример самый простейший, только с основной, «базовой» информацией. в более «навороченных» коммитах может присутствовать и другая информация: и описание метки (tag), и подписи, и дополнительные «родительские» коммиты (для коммита слияния) и проч.
хэш (sha1-сумма) высчитывается от такой информации:
тип-объекта длина-объекта\0содержимое-объекта
для приведённого выше примера можно пересчитать хэш таким вот образом:
$ (printf "commit %s\0" $(git cat-file commit 3cbc0fb39 | wc -c); git cat-file commit 3cbc0fb39) | sha1sum
3cbc0fb39c84ae0a51a9a88649dccd105bf17d6e -
хэш получился идентичный.