gpt4 book ai didi

git - 为什么 git 树对象不以与提交和标签相同的方式对 SHA-1 哈希进行编码?

转载 作者:太空狗 更新时间:2023-10-29 13:46:48 25 4
gpt4 key购买 nike

给定一个简单的存储库

$ touch empty ; git add empty ; git commit -m 'My commit'[master (root-commit) e9cc922] My commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 empty$ git tag -a -m 'My tag' mytag

我们注意到其中一件事情与其他事情不同,强调如下。为什么树对象将 SHA-1 哈希直接编码为 20 个无符号字节的序列,而提交和标记将它们编码为 40 个 ASCII 十六进制数字?

我在调查 answer to a related question about git internal storage 时注意到了差异.

$ for f in .git/objects/??/* ; do echo $f ; openssl zlib -d < "$f" | xxd ; echo ; done.git/objects/41/7c01c8795a35b8e835113a85a5c0c1c77f67fb00000000: 7472 6565 2033 3300 3130 3036 3434 2065  tree 33.100644 e00000010: 6d70 7479 00e6 9de2 9bb2 d1d6 434b 8b29  mpty........CK.)00000020: ae77 5ad8 c2e4 8c53 91                   .wZ....S..git/objects/da/867754dac38858c708292f49de41b7eff6f5d700000000: 7461 6720 3133 3400 6f62 6a65 6374 2065  tag 134.object e00000010: 3963 6339 3232 3632 6561 3734 3138 3864  9cc92262ea74188d00000020: 6530 3436 6563 6166 3265 3363 3063 3061  e046ecaf2e3c0c0a00000030: 3436 3966 3734 320a 7479 7065 2063 6f6d  469f742.type com00000040: 6d69 740a 7461 6720 6d79 7461 670a 7461  mit.tag mytag.ta00000050: 6767 6572 2047 7265 6720 4261 636f 6e20  gger Greg Bacon00000060: 3c67 6261 636f 6e40 666f 6f2e 696e 7661  <gbacon@foo.inva00000070: 6c69 643e 2031 3435 3737 3035 3338 3820  lid> 145770538800000080: 2d30 3630 300a 0a4d 7920 7461 670a       -0600..My tag..git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c539100000000: 626c 6f62 2030 00                        blob 0..git/objects/e9/cc92262ea74188de046ecaf2e3c0c0a469f74200000000: 636f 6d6d 6974 2031 3732 0074 7265 6520  commit 172.tree00000010: 3431 3763 3031 6338 3739 3561 3335 6238  417c01c8795a35b800000020: 6538 3335 3131 3361 3835 6135 6330 6331  e835113a85a5c0c100000030: 6337 3766 3637 6662 0a61 7574 686f 7220  c77f67fb.author00000040: 4772 6567 2042 6163 6f6e 203c 6762 6163  Greg Bacon <gbac00000050: 6f6e 4066 6f6f 2e69 6e76 616c 6964 3e20  on@foo.invalid>00000060: 3134 3537 3730 3531 3736 202d 3036 3030  1457705176 -060000000070: 0a63 6f6d 6d69 7474 6572 2047 7265 6720  .committer Greg00000080: 4261 636f 6e20 3c67 6261 636f 6e40 666f  Bacon <gbacon@fo00000090: 6f2e 696e 7661 6c69 643e 2031 3435 3737  o.invalid> 14577000000a0: 3035 3137 3620 2d30 3630 300a 0a4d 7920  05176 -0600..My000000b0: 636f 6d6d 6974 0a                        commit.

最佳答案

comment关于你的问题 Philip Oakley提到在 git 邮件列表中找到了一些东西,但不幸的是没有进一步详细说明。

我在浏览邮件列表时发现的所有内容都是 these两个threads其中 Jakub Narębski还有asks (2011)

What was Linus thinking?!?

tells (2013) 他

[...] always wondered why this is the sole object format where SHA-1 is in 20- byte binary format and not 40-chars hexadecimal string format

但没有得到任何反应/回应。

我也很想知道邮件列表中是否还有其他帖子,是否真的有某种解释,或者 Philip Oakley 是否也只考虑了其中一个线程(或另一个没有解释的线程)。

正如我提到的第一个线程(从 2011 年开始)实际上最初是关于“git cat-file -p 不一致”的,Philip Oakley 也提到了他看到的线程“与 git cat- * 命令”我想这可能是他记得的那个。 :/

(这并没有真正回答问题,但至少表明这种不一致甚至让 git core devs 感到困惑。因为我是新用户,我不能将其作为评论发布)

关于git - 为什么 git 树对象不以与提交和标签相同的方式对 SHA-1 哈希进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35942637/

25 4 0