git 当内容以数字开头时,哈希对象与 shasum 不匹配

git hash-object vs shasum doesn't match when the content starts with a number

我正在尝试开发自定义解决方案以连接到 git API,当我对以字母开头的内容执行 shasum 时,结果匹配:

$ echo -e -n "blob 4[=11=]test" | shasum
30d74d258442c7c65512eafab474568dd706c430 *-

$ echo -e -n "test" | git hash-object --stdin
30d74d258442c7c65512eafab474568dd706c430

内容以数字开头时不匹配:

$ echo -e -n "blob 5[=12=]test" | shasum
315a7861230f24fade469e87c0c548f0cc4bc8c8 *-

$ echo -e -n "0test" | git hash-object --stdin
475a3cf5e5dadf80fe51cc8748c9bfdabae29f07

我很困惑为什么会给出不同的结果,有人知道为什么会这样吗?

当您使用 echo -e 时,您在编写 [=12=] 时提供了八进制转义。之后添加额外的数字会导致它们被解释为八进制转义中的八进制数字。

因为 POSIX 没有定义 echo -e 并且它不可移植,所以最好使用 printf,因为你知道八进制转义将被一致地解释并且可以最多包含三个数字:

$ printf "blob 5[=10=]00test" | shasum
475a3cf5e5dadf80fe51cc8748c9bfdabae29f07  -
$ printf "0test" | git hash-object --stdin
475a3cf5e5dadf80fe51cc8748c9bfdabae29f07

在第一次调用中,[=15=]00是八进制转义[=16=]0(一个NUL字节)加上字符0(十进制48)。