Git 哈希对象在 Powershell、CMD 和 Bash 中产生不同的 SHA1?

Git hash-object is yielding different SHA1 in Powershell, CMD and Bash?

我认为无论平台如何,SHA1 值都是相同的。我今天遇到了这个,希望能在这里得到一些澄清。

我的测试字符串是:'Apple Pie'

在Bash中:

echo 'Apple Pie' | git hash-object --stdin
23991897e13e47ed0adb91a0082c31c82fe0cbe5

在CMD中(Windows 10):

echo 'Apple Pie' | git hash-object --stdin
f554ff1fdde0e3c2ca9f67849791456302b5c12b

在 Powershell 5.0 (Windows 10) 中:

echo 'Apple Pie' | git hash-object --stdin
157cb7be4778a9cfad23b6fb514e364522167053

我现在很困惑 git 在这里是如何工作的,因为文件内容的 sha1 密钥在不同的环境中非常不同,我不确定如果我将一个项目克隆到我的 linux 在Powershell中构建的机器? git 或 SHA1 通常会出现这种行为吗?

这三个值无疑都是正确的。您看到的是 echo 在三个命令解释器中不是同一个命令!

$ printf 'Apple Pie\n' | git hash-object --stdin
23991897e13e47ed0adb91a0082c31c82fe0cbe5
$ printf 'Apple Pie\r\n' | git hash-object --stdin
157cb7be4778a9cfad23b6fb514e364522167053

编辑:Windows 10 CMD 可以通过以下方式在 bash 中模拟(以获得相同的散列):

$ printf "'Apple Pie' \r\n" | git hash-object --stdin
f554ff1fdde0e3c2ca9f67849791456302b5c12b

感谢 的提示。

我在做 CMake 项目时 运行 遇到了类似的问题。我发现您可以通过添加 --path / 选项来创建一致性。根据 Git docs--path 对对象进行哈希处理,就好像它位于给定路径上一样,如果文件确实存在,则应用任何合适的过滤器。

由于 st运行ge 引用解析,它不适用于 CMD 的 echo 问题,它仍然不适用于 CMD 中的单引号,但它会起作用大多数程序的输出。

在我的例子中,我使用 cmake -E echo 命令代替 echo,然后将其通过管道传输到 git hash-object --path / --stdin 并能够获得一致的哈希值。

在Bash中:

cmake -E echo "Apple Pie" | git hash-object --path / --stdin
23991897e13e47ed0adb91a0082c31c82fe0cbe5

在 CMD 中:

cmake -E echo "Apple Pie" | git hash-object --path / --stdin
23991897e13e47ed0adb91a0082c31c82fe0cbe5

在 PowerShell 中:

cmake -E echo "Apple Pie" | git hash-object --path / --stdin
23991897e13e47ed0adb91a0082c31c82fe0cbe5