Git 为什么我没有得到相同的SHA-1?

Git 为什么我没有得到相同的SHA-1?,git,Git,我尝试了以下两个命令: philip@X230:~/Desktop/learn_git$echo“怎么了,doc?”| git hash object-stdin 7108f7ecb345ee9d0084193f147cdad4d2998293 philip@X230:~/Desktop/learn\u git$echo“blob 16\u0000怎么了,doc?”| openssl sha1 标准偏差=5bc40a1cd865de7a0a4641d3d059b1216ed9042c 我想知道为

我尝试了以下两个命令:

philip@X230:~/Desktop/learn_git$echo“怎么了,doc?”| git hash object-stdin 7108f7ecb345ee9d0084193f147cdad4d2998293 philip@X230:~/Desktop/learn\u git$echo“blob 16\u0000怎么了,doc?”| openssl sha1 标准偏差=5bc40a1cd865de7a0a4641d3d059b1216ed9042c 我想知道为什么我得不到同样的SHA-1有两件事:

echo“what is up,doc?”输出17个字符,包括结尾的换行符。您应该同时使用echo-n和bash删除末尾的换行符,或者将手动构造的blob的长度调整为17

您的\u0000逃逸无效测试它,运行echo“blob 16\u000What is up,doc?”到控制台,而不通过管道进入sha1。假设bash使echo解释任何转义,则需要使用-e选项

如果你这样做

echo -e 'blob 17\u0000what is up, doc?' | openssl sha1
结果是

(stdin)= 7108f7ecb345ee9d0084193f147cdad4d2998293
它很好地匹配git哈希对象。

两件事:

echo“what is up,doc?”输出17个字符,包括结尾的换行符。您应该同时使用echo-n和bash删除末尾的换行符,或者将手动构造的blob的长度调整为17

您的\u0000逃逸无效测试它,运行echo“blob 16\u000What is up,doc?”到控制台,而不通过管道进入sha1。假设bash使echo解释任何转义,则需要使用-e选项

如果你这样做

echo -e 'blob 17\u0000what is up, doc?' | openssl sha1
结果是

(stdin)= 7108f7ecb345ee9d0084193f147cdad4d2998293
它很好地匹配了git哈希对象。

echo在其输出中添加了一个换行符,因此您的内容实际上是17字节长,而不是16字节长。尝试使用printf,它更标准化,但不能做到这一点:

$ printf '%s' 'what is up, doc?' | git hash-object --stdin
bd9dbf5aae1a3862dd1526723246b20206e5fc37
$ printf 'blob 16\0%s' 'what is up, doc?' | sha1sum
bd9dbf5aae1a3862dd1526723246b20206e5fc37  -
echo在其输出中附加一个换行符,因此您的内容实际上是17字节长,而不是16字节长。尝试使用printf,它更标准化,但不能做到这一点:

$ printf '%s' 'what is up, doc?' | git hash-object --stdin
bd9dbf5aae1a3862dd1526723246b20206e5fc37
$ printf 'blob 16\0%s' 'what is up, doc?' | sha1sum
bd9dbf5aae1a3862dd1526723246b20206e5fc37  -

这个命令与macOS和linux都兼容吗?printf是由POSIX指定的,因此它确实与macOS和linux都兼容。sha1sum不是macOS附带的,您需要使用不同的工具。此命令是否与macOS和linux兼容?printf由POSIX指定,因此它确实与macOS和linux兼容。sha1sum不是macOS附带的,您需要使用不同的工具。但是在这种情况下,为什么包含相同字符串的.txt文件上的hash object命令会给出与echo-e“blob 17\u0000what is up,doc?”| openssl sha1相同的哈希值?这是否意味着git也会添加一个新行?@Giant8不,这意味着你的文本文件中有一个是正常的。为什么它是正常的?想想cat myfile myfile,或者echo header;cat-myfile;回声预告片。文本文件必须以换行符终止,否则你不能像对待文本文件一样对待它们,你必须检查它们。你可以保持地板干净,这样你就不必每一步都检查玩具和碎玻璃。但是在这种情况下,为什么在包含相同字符串的.txt文件上的hash object命令会给出与echo-e“blob 17\u0000what is up,doc?”| openssl sha1相同的哈希值?这是否意味着git也会添加一个新行?@Giant8不,这意味着你的文本文件中有一个是正常的。为什么它是正常的?想想cat myfile myfile,或者echo header;cat-myfile;回声预告片。文本文件必须以换行符终止,否则你不能像对待文本文件一样对待它们,你必须检查它们。你保持地板清洁,这样你就不必每一步都检查玩具和碎玻璃。