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

时间:2018-02-17 00:05:16

标签: bash git powershell hash sha1

我认为无论平台如何,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键在不同的环境中是非常不同的,我不确定如果我将一个项目克隆到我的在Powershell中构建的linux机器中它是否会起作用?这种行为一般是在git或SHA1中预期的吗?

2 个答案:

答案 0 :(得分:5)

这三个值无疑都是正确的。你看到的是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

感谢此处提示that other guy

答案 1 :(得分:1)

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

由于引号解析很奇怪,因此它不适用于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