Git hash-object在Powershell、CMD和Bash中产生不同的SHA1值?

4
我认为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个回答

7

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

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

编辑:可以通过bash模拟Windows 10 CMD(以获得相同的哈希值),具体方法如下:

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

感谢那个人在这里提供的提示。


感谢您的详细解释,现在我知道问题出在echo命令上,而不是实际文件内容上,非常感谢。 - Dilshad Abduwali
Windows 10 CMD 使用当前的代码页。与以前的版本相同。 - Maximilian Burszley
CMD校验和是printf "'Apple Pie' \r\n" | git hash-object --stdin。在DOS和现在的CMD中,解析引号和空格取决于各个程序。 - that other guy
@thatotherguy:啊哈!是的,我忘了(因为我避免使用Windows),Windows命令解析是如此的特别和反复无常。 :-) - torek
@thatotherguy 自2001年以来,DOS已经不再使用。您错误地将CMD和DOS等同起来。 - Maximilian Burszley
@TheIncorrigible1 这个设计决策直接从DOS延续而来。这并不意味着DOS和CMD是同一回事。 - that other guy

2

我在进行一个CMake项目时遇到了类似的问题。我发现你可以通过添加--path /选项来创建一致性。根据Git文档--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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接