在特定提交中获取文件的 SHA 哈希

gra*_*olf 5 git

如何在指定的提交中获取文件的 SHA 哈希?我可以使用 获取触及文件的所有提交git log file,但是如何在每个特定提交中获取文件的 SHA 哈希值?

我想我可以通过检查提交而不是使用来做到这一点git-hash-object,但必须有更简单的方法。

tor*_*rek 5

有一种非常快速的方法可以在某个提交中获取文件的 Git 哈希值:

git rev-parse <commit-ID>:/path/to/file
Run Code Online (Sandbox Code Playgroud)

Git 的哈希是单词的 SHA-1blob后跟一个空格,然后是一个十进制 ASCII 字符串,以字节为单位给出文件的大小,然后是一个 NUL 字节,然后是文件的内容:

size=$(wc -c $file)
(printf "blob %d\0" $size; cat $file) | sha1sum -
Run Code Online (Sandbox Code Playgroud)

但是,从注释看来,就像您想要文件内容的实际 SHA-1(就像其他人通过提取文件并sha1sum在其上运行一样),而不是git哈希:

git show <commit-ID>:path | sha1sum -
Run Code Online (Sandbox Code Playgroud)

是通用的(非 bash 特定的)方法(bash<(也可以,只要确保您安装了 fdesc 文件系统)。


Gre*_*con 5

git show并且git log是近亲和股票期权。您的问题询问了与特定提交相关联的文件的 SHA-1 对象名称,但也询问了历史记录中每次提交的相同信息。

--raw选项提供了您想要的信息。下面的示例将使用 git 自己的存储库。

要显示随特定提交而更改的文件,请使用git showgit log -1。后者不会为标记对象生成输出,而只会为标记提交生成输出。

$ git log -1 --raw v2.8.1
提交 d95553a6b8c5153f541adcfc3346004e8249b0e6
作者:Junio C Hamano <gitster@pobox.com>
日期:2016 年 4 月 3 日星期日 10:11:35 -0700

    git 2.8.1

    签字人:Junio C Hamano <gitster@pobox.com>

:000000 100644 0000000... ef6d80b... 文档/RelNotes/2.8.1.txt
:100644 100644 adc940b ... 8afe349 ... M 文档/git.txt
:100755 100755 4e9450b... 46595da... M GIT-VERSION-GEN
:120000 120000 7db3040...d40c3e1...M RelNotes

每个更改行包含

  • 开始或源模式(000000表示已创建或未合并)
  • 结果或目标模式(000000表示已删除或未合并)
  • 源 SHA-1(创建时全为零)
  • 目标 SHA-1(全零用于删除)
  • 状态码加可选的数字分数(以上A是添加和M修改)
  • 小路

有关完整详细信息,请参阅的文档中的“原始输出格式”git diff

RelNotes与 v2.8.1 标签关联的文件的 SHA-1 对象名称是 d40c3e1,我们可以验证并扩展到所有四十位数字

$ git rev-parse v2.8.1:RelNotes
d40c3e126c03b0e4bd9c6162f63a35a45f5e9020

在 2.8.1 版本的历史记录中RelNotes,显示 的哈希值,这是一个符号链接,指向Documentation/RelNotes对应于给定版本的下层:

$ git log --raw v2.8.1 -- RelNotes
提交 d95553a6b8c5153f541adcfc3346004e8249b0e6
作者:Junio C Hamano <gitster@pobox.com>
日期:2016 年 4 月 3 日星期日 10:11:35 -0700

    git 2.8.1

    签字人:Junio C Hamano <gitster@pobox.com>

:120000 120000 7db3040...d40c3e1...M RelNotes

提交 c9906e47c065940bfe1a9992da494a8f437a49ac
作者:Junio C Hamano <gitster@pobox.com>
日期:2016 年 1 月 12 日星期二 15:20:51 -0800

    2.7 后周期的第一批

    签字人:Junio C Hamano <gitster@pobox.com>

:120000 120000 3ba13ce... 7db3040... M RelNotes

提交 24a00ef646974be49ef7138239c3803805400797
作者:Junio C Hamano <gitster@pobox.com>
日期:2015 年 10 月 5 日星期一 12:58:10 -0700

    开始循环向 2.7

    签字人:Junio C Hamano <gitster@pobox.com>

:120000 120000 def6ebd... 3ba13ce... M RelNotes
[...]

使用该--abbrev选项获取哈希的所有四十位十六进制数字。这里的输出会显得格外git show冗长,因为输出涵盖了 v2.8.1 标签和指向哪个提交v2.8.1

$ git show --raw --abbrev=40 v2.8.1
标签 v2.8.1
标注者:Junio C Hamano <gitster@pobox.com>
日期:2016年4月3日星期日10:14:32 -0700

git 2.8.1
-----开始PGP签名-----
版本:GnuPG v1

iQIcBAABAgAGBQJXAU94AAoJELC16IaWr+bLopQQAONTo52BGPCr7exw757SKY90
gYsHDxTaNpPtGZS7ltdOiEESPG3Mx3w1OYk7CBPtxjBLM+JvEdcZsCKrs/RlTrKL
lTc53WHC1tUa8EYjEyHNq4z0E2y4tCTNsj5eD2n/lAdTn2SK59bL4DEouDP2mYJU
3pUkujD9tu/ATw1s77VNiHxcrg9V9TdltaP2+lkHPzXXx8fb8kkabFRkzqvQdgfe
Qe0mZEHKRZY4nEO16dKukalxyWW0iMfoSveRTjJiQU4HEcMyEnG3lfKeI1ddKVTQ
+XfAM6QianXqdfHRt5ol9MwCm9HAcGWu82caIBOTsc3L7bDrbJTTkDOvwpmVUDJi
WcqgocDGr/x7RA0/E8bqoIv40UXx07DzBTv3mKBo2CMvkow6pgQjsKKfPrvoNKyC
qFqp07A3UXgLWeWLF2iaYJklkq2jEeLPKOCJ1lJcPUg+Kk20+FQEo1XPERnrosoz
xHDDMBy7Vnvd0ij8Ipaxj2XHfIVYHC/WcrfsjiRYa1sHMjdTw/6I0tdtdUkDiY2W
70AsYQUWPtU52tSuK7divMoym3g583bNtu5X+6STDtLZc5XbVAtMEg5PYadTuwci
tTmXTUrti2qLsDp2XZI7rKbKVo5JyW8BYC8BeLUwgVnkj9svG5+6rlTKtgXa+hCo
L9gDU1Iie03IlIHnL+/s
=NLvn
-----结束PGP签名-----

提交 d95553a6b8c5153f541adcfc3346004e8249b0e6
作者:Junio C Hamano <gitster@pobox.com>
日期:2016 年 4 月 3 日星期日 10:11:35 -0700

    git 2.8.1

    签字人:Junio C Hamano <gitster@pobox.com>

:000000 100644 0000000000000000000000000000000000000000 ef6d80b008a0a7970238404b034593be27e933c3R.txt/A.txt
:100644 100644 adc940bf7591069c74c9b47aa5e5686e0438d606 8afe349781d57527083fdb75511959fd25a4239b M 文档/git.txt
:100755 100755 4e9450b3ae0c403820f0166435c52c4ea74e7451 46595dad2234f861198347ef8f4f60d167061709 M GIT-GEN
:120000 120000 7db30403c3471e15f4f15a5e68016d7926b3e3de d40c3e126c03b0e4bd9c6162f63a35a45f5e9020 M Renotel

blob 的 SHA-1 对象名称(git 如何表示文件内容)与sha1sum在文件上运行不同,因为 git 在前面添加元数据:文字 string blob,后跟一个空格,后跟十进制内容的长度, 并以 NUL 字节结束。要计算一个文件的连续版本的内容的 SHA-1 哈希值,请使用以下命令

$ 在 $(git log --pretty=%H v2.8.1 -- RelNotes | head -3) 中提交;\
    do git show ${commit}:RelNotes | sha1sum ; \
  完毕
ce5501f9daadf110a20a4e4ecdfed63ef4b27e3 -
bd4d920214c4a48d8820292e24f020690595858d -
5d47b511d86abd490fa4f2c2a8d4ef3589e1aecf -

随着--pretty=%H-- RelNotes我们告诉混帐,我们只想提交的SHA-1散列那一抹RelNotes(仅限于三个最近有head -3)。然后对于这些提交中的每一个,我们将跟踪的内容提供给sha1sum

如果你愿意xargs,它看起来像

$ git log --pretty=%H v2.8.1 -- RelNotes | 头-3 |
    xargs -I {} sh -c 'git show {}:RelNotes | sha1sum'
ce5501f9daadf110a20a4e4ecdfed63ef4b27e3 -
bd4d920214c4a48d8820292e24f020690595858d -
5d47b511d86abd490fa4f2c2a8d4ef3589e1aecf -