【发布时间】:2010-10-02 09:32:03
【问题描述】:
我在“索引”中添加了一个文件:
git add myfile.java
如何找出这个文件的 SHA1?
【问题讨论】:
-
仅供参考:the inverse question的种类
-
git rev-parse :myfile.java -
@jthill,不知道为什么这不是一个单独的答案。
我在“索引”中添加了一个文件:
git add myfile.java
如何找出这个文件的 SHA1?
【问题讨论】:
git rev-parse :myfile.java
这是一个老问题,但有一点需要澄清:
这个问题和下面的答案讨论了一个文件的 Git 哈希,它与不完全相同 “该文件的 SHA1” em> 如问题中所述。
简而言之:
如果你想获得 索引中文件的 Git 哈希 - 请参阅 the answer by CB Bailey:
git ls-files -s $file
如果您想获取文件系统上任何文件的 Git 哈希 - 请参阅 the answer by cnu:
git hash-object $file
如果您想获取文件系统上任何文件的 Git 哈希并且您没有安装 Git:
(echo -ne "blob `wc -c < $file`\0"; cat $file) | sha1sum
(上面显示了 Git 哈希的实际计算方式 - 它不是文件的 sha1 总和,而是字符串 "blob SIZE\0CONTENT" 其中 "blob" 的 sha1 总和 字面意思是一个字符串“blob”(后跟一个空格),SIZE 是以字节为单位的文件大小(ASCII 十进制),“\0” 是空字符,CONTENT 是实际文件的内容)。
如果您只想获得 “此文件的 SHA1”,正如问题中的字面意思:
sha1sum < $file
如果您没有sha1sum,您可以使用shasum -a1 或openssl dgst -sha1(输出格式略有不同)。
【讨论】:
git diff 为空),仅仅是因为 cmets、时间戳或历史记录不同。给定两台机器上没有相互连接的两个 git repos,我如何确认两个提交实际上具有相同的内容?
您希望将-s 选项改为git ls-files。这为您提供了索引中文件的模式和 sha1 哈希值。
git ls-files -s myfile.java
请注意,您不需要git hash-object,因为这会为您提供当前工作树中文件的 sha1 id,而不是您添加到索引中的文件的 sha1 id。在 git add 之后对工作树副本进行更改后,这些将有所不同。
【讨论】:
sha1sum README.md?
$ git hash-object myfile.java
802992c4220de19a90767f3000a79a31b98d0df7
【讨论】:
git hash-object 仍然对某些东西有用,否则需要做类似( perl -e '$size = (-s shift); print "blob $size\x00"' foo.txt && cat foo.txt ) | openssl sha1 的事情。此外,它自己生成哈希,而 ls-files -s 似乎需要一些 cutting 来隔离该哈希。
git ls-files -s README.md (=git hash-object README.md) 在任何存储库中都不是sha1sum README.md!