Дайджест SHA1 рассчитывается по строке заголовка, за которой следуют данные файла.Заголовок состоит из типа объекта, пробела и длины объекта в байтах в десятичном виде.Это отделяется от данных нулевым байтом.
Итак:
$ git hash-object foo.txt
f70f10e4db19068f79bc43844b49f3eece45c4e8
$ ( perl -e '$size = (-s shift); print "blob $size\x00"' foo.txt \
&& cat foo.txt ) | openssl sha1
f70f10e4db19068f79bc43844b49f3eece45c4e8
Одним из следствий этого является то, что «пустое дерево» и «пустой» BLOB имеют разные идентификаторы.То есть:
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 всегда означает «пустой файл».потому что он распознается как особый случай и никогда не сохраняется (в современных версиях Git).Напротив, если вы добавите в репозиторий пустой файл, будет сохранен блоб «e69de29bb2d1d6434b8b29ae775ad8c2e48c5391».