我认为无论平台如何,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中预期的吗?
答案 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