2014-01-26 2 views
1

Я хочу рассчитать git SHA-хэш без использования функции объекта git hash, то есть я хочу использовать функцию shasum для ее вычисления.Разница в SHA Hash между git hash-object & git hash-object -t

Я знаю, что для следующего случая

body="tree 491e9405120eaaa57cce3938fd38508d85a5e08b 
parent 8550f0f1a7e32fb1bb0933b0294c116a8dbe6dce 
author user <[email protected]> 1390718030 +0000 
committer user <[email protected]> 1390718030 +0000 
This is a test" 

echo $body | git hash-object -w --stdin #755481b921f13bcfd731d74287a0c5847519ee81 

l=`expr ${#body} + 1` 
echo -e 'blob $l\0$body' | shasum #755481b921f13bcfd731d74287a0c5847519ee81 

хэши одинаковы. Но если я использую параметр -t commit в хэш-объекте, я получаю другой хэш. Как я могу вычислить хеш фиксации с помощью shasum?

git hash-object -t commit --stdin <<< "$body" #b4c45adbbe35d3d3c73de48d039a8e3038f5ec54 

ответ

2

Вы изменили тип объекта, с которым вы создали хэш.
От git hash-object

-t <type> 

    Specify the type (default: "blob"). 

Вы пошли из сгустка по умолчанию для фиксации.

И фактически написанный объект начинается с типа объекта, который является частью того, что должен вычислять sha1.
См:

Git вычисляет SHA1 для файла (или, с точки зрения Git, "комком"):

sha1("blob " + filesize + "\0" + data) 

Это изменяет содержание того, что принимается во внимание ша1.
С -t commit вы изменяете этот префикс (он больше не «blob»), а поскольку контент отличается, sha1 также отличается.

Вы можете сделать:

python -c "import zlib,sys;print repr(zlib.decompress(sys.stdin.read()))" < .git/objects/02/b365d4af3ef6f74b0b1f18c41507c82b3ee571: 

Первое слово будет тип содержания

Для получения дополнительной контрольной проверки How Git Works

+0

Для возникновения этого префикса: HTTP: // StackOverflow .com/a/8276305/6309 – VonC

+0

Хорошо. Есть ли способ узнать, что такое контент, чтобы я мог делать это с SHA1 ??? Это заставляет его работать и для параметра commit, добавив дополнительный контент? –

+0

@RamGAthreya, как показано на http://slidetocode.com/2013/08/25/how-git-works/, вы можете выполнить: 'python -c 'импорт zlib, sys; print repr (zlib.decompress (sys .stdin.read())) "<.git/objects/02/b365d4af3ef6f74b0b1f18c41507c82b3ee571': первое слово будет типом содержимого. – VonC

Смежные вопросы