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

git*_*oob 42 git sha1

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

git add myfile.java
Run Code Online (Sandbox Code Playgroud)

我怎么找到这个文件的SHA1?

rsp*_*rsp 85

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

这个问题和下面的答案讨论了一个文件的Git哈希,它与问题中提到"此文件的SHA1" 不完全相同 .

简而言之:

如果你想在索引中获取文件Git哈希值 - 请参阅 Charles Bailey的答案:

git ls-files -s $file
Run Code Online (Sandbox Code Playgroud)

如果你想获得文件系统上任何文件Git哈希 - 请参阅 cnu的答案:

git hash-object $file
Run Code Online (Sandbox Code Playgroud)

如果你想获得文件系统上任何文件Git哈希并且你没有安装Git:

(echo -ne "blob `wc -c < $file`\0"; cat $file) | sha1sum
Run Code Online (Sandbox Code Playgroud)

(上面显示了如何实际计算Git哈希值 - 它不是文件的sha1总和,而是字符串"blob SIZE\0CONTENT"的sha1和,其中"blob"实际上是字符串"blob"(后面是space),SIZE是文件大小(以字节为单位)(ASCII十进制),"\ 0"是空字符,CONTENT是实际文件的内容).

如果你想得到问题中字面上提到的"这个文件的SHA1":

sha1sum < $file
Run Code Online (Sandbox Code Playgroud)

如果你没有,sha1sum你可以使用shasum -a1openssl dgst -sha1(输出格式略有不同).


CB *_*ley 60

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

git ls-files -s myfile.java
Run Code Online (Sandbox Code Playgroud)

请注意,您不希望这样,git hash-object因为它为您提供当前工作树中文件的sha1 id,而不是您添加到索引中的文件.一旦您在工作树副本之后进行更改,这些将会有所不同git add.

  • 如何从git*获取实际文件SHA1*,如`sha1sum README.md`? (3认同)

cnu*_*cnu 21

$ git hash-object myfile.java
802992c4220de19a90767f3000a79a31b98d0df7
Run Code Online (Sandbox Code Playgroud)

  • 这就是为什么这个答案的评级比Charles更差的原因:这实际上为你提供了工作树中文件版本的SHA1,而不是索引/分阶段版本.它还有一个缺点,即它已经存储在索引中,它需要重新计算SHA1. (10认同)