Git pack文件名 - 什么是摘要?

rom*_*mul 6 git pack

Git中存储单个对象.git/objects/ab/cdefgh...,其中ab是SHA1摘要的第一个字节.

但是,打包文件不遵循相同的命名策略,我找不到有关如何命名的文档.任何见解?

Mar*_*air 9

包文件保存objects/packgitrepository布局中.在这个目录中,它们被存储为索引文件和包文件本身的对,例如:

pack-a862cfa8b080773290073999c800a2e655ef9b5d.idx
pack-a862cfa8b080773290073999c800a2e655ef9b5d.pack
Run Code Online (Sandbox Code Playgroud)

如何计算这些文件名中的SHA1sum在git-pack-objects文档中解释(我的重点):

写入一对文件(.pack和.idx),使用<base-name>确定创建文件的名称.使用此选项时,这两个文件以<base-name> - <SHA1>.<pack,idx>文件写入.<SHA1>是已排序对象名称的哈希值,用于根据包内容生成结果文件名,并写入命令的标准输出.

对象名称是包文件中的对象的SHA1sums.

  • 在撰写本文时这是正确的,但在2013年有所更改(https://github.com/git/git/commit/1190a1ac/https://github.com/git/git/commit/40a4f5a7)。现在是尾部校验和(等于文件最后20个字节的十六进制)。 (3认同)

mgi*_*uca 5

答案是“整个包文件的 SHA-1 哈希,减去最后 20 个字节”,或“最后 20 个字节的十六进制摘要”(两者是等效的)。

文件的最后 20 个字节是“尾部校验和”,它本身是整个文件(减去最后 20 个字节)的SHA-1 哈希

在 2013发生了变化(以前它是文件中所有哈希的 SHA-1 总和)。请注意,文档现在只是简单地读取“是基于包内容的哈希”。作者明确不保证 SHA-1 是如何计算的(来自提交日志:“希望这会阻止读者依赖旧的或新的计算。”)。