题 Git - 在索引中查找单个文件的SHA1


我已经在'index'中添加了一个文件:

git add myfile.java

我如何找到该文件的SHA1?


35
2018-01-20 06:50


起源


仅供参考:有点 反问题 - Albert
git rev-parse :myfile.java - jthill
@jthill,不知道为什么这不是一个答案。 - akhan


答案:


你想要的 -s 选项 git ls-files。这为您提供了索引中文件的模式和sha1哈希。

git ls-files -s myfile.java

请注意,你不想要 git hash-object 因为这会为您提供当前工作树中文件的sha1 id,而不是您添加到索引中的文件的sha1 id。一旦您更改了工作树副本后,这些将会有所不同 git add


50
2018-01-20 08:04



如何获取真实文件SHA1 来自git作为 sha1sum README.md? - Peter Krauss


这是一个老问题,但有一点需要澄清:

这个问题和下面的答案谈到 Git哈希 一个文件的 与...完全不一样  “这个文件的SHA1” 正如问题所述。

简而言之:

如果你想得到 索引中文件的Git哈希值  - 看 Charles Bailey的回答

git ls-files -s $file

如果你想得到 Git散列文件系统上的任何文件  - 看 cnu的答案

git hash-object $file

如果你想得到 你的文件系统上的任何文件的Git哈希,你没有安装Git

(echo -ne "blob `wc -c < $file`\0"; cat $file) | sha1sum

(上面显示了如何实际计算Git哈希 - 它不是文件的sha1总和而是字符串的sha1和 “blob SIZE \ 0CONTENT” 哪里 “斑点” 字面意思是一个字符串“blob”(后跟一个空格), 尺寸 是以字节为单位的文件大小(ASCII十进制), “\ 0” 是空字符和 内容 是实际文件的内容)。

如果你想得到公正的话 “这个文件的SHA1” 正如在问题中字面上提到的那样:

sha1sum < $file

如果你没有 sha1sum 您可以使用 shasum -a1 要么 openssl dgst -sha1 (输出格式略有不同)。


67
2018-06-18 10:35



非常好的答案,我想为compute-hash-no-Git解决方案提供两次upvote。 - javabrett
另一个问题是,是否对提交的组合文件和文件夹内容计算了哈希值?即两个不同的提交可能具有相同的内容(git diff 因为评论,时间戳或历史是不同的,所以是空的。在两台没有相互连接的机器上给出两个git repos,我如何确认两个提交实际上具有相同的内容? - Aaron McDaid


$ git hash-object myfile.java
802992c4220de19a90767f3000a79a31b98d0df7

19
2018-01-20 07:00



非常感谢! - 这就是诀窍。 - git-noob
这就是为什么这个答案得分比Charles更差的原因:这实际上为你提供了工作树中文件版本的SHA1,而不是索引/分阶段版本。它还有一个缺点,即它已经存储在索引中,它需要重新计算SHA1。 - Jan Krüger
@JanKrüger感谢您的澄清!很有帮助。现在, git hash-object 对某些东西仍然有用,否则就需要做一些事情 ( perl -e '$size = (-s shift); print "blob $size\x00"' foo.txt && cat foo.txt ) | openssl sha1。此外,它自己产生哈希,而它 ls-files -s似乎需要一些 cutting隔离那个哈希。 - Steven Lu
不适用于符号链接 - akhan
如何申请真正的SHA1? git ls-files -s README.md (=git hash-object README.md) 不是 sha1sum README.md  在任何存储库! - Peter Krauss