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
我认为无论平台如何,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