Git索引文件十六进制转储相关技术问题咨询
Git索引文件相关问题解答
问题1:索引文件的SHA-1值是什么?转储最后20字节是否为该值?为何git hash-object .git/index结果与末尾20字节不匹配?
- 你的索引文件的SHA-1值就是
git hash-object .git/index输出的f0d0468a496b4cd29fd090e5d417639a7ce07bf8。 - 转储结果的最后20字节不是这个值。核心原因是:文件末尾的20字节是对前面所有内容(不含这20字节)计算出的SHA-1校验和;而
git hash-object是对**整个文件(包括末尾的20字节校验和)**计算SHA-1,两者计算的输入范围完全不同,结果自然不匹配。 - 验证方法:截掉索引文件的最后20字节,对剩余内容计算SHA-1,得到的结果会和文件末尾的20字节(二进制转十六进制字符串后)完全一致。
问题2:最后20字节之前的8个0000 0000 0000 0000字节代表什么?是否为空终止?若是,空字节最多允许多少个?若不是,我的空字节位于何处?
- 这8个0字节是索引文件的扩展区预留空间。Git索引版本2及以上支持在条目区之后、校验和之前添加扩展数据(比如跟踪文件的额外属性),如果当前没有任何扩展数据,就会用0字节填充该区域。
- 这不是空终止(空终止是字符串的结束标记),属于文件结构上的预留填充。
- Git没有严格限制这里最多允许多少个0字节,只要扩展区格式符合规范(有扩展时),无扩展时的0填充只要不破坏文件结构即可。
- 你的空字节位于
README.enc条目结束之后、校验和之前的位置,对应十六进制转储中偏移00000050到00000057的0000 0000 0000 0000部分。
内容的提问来源于stack exchange,提问作者Ichigo Kurosaki
相关产品推荐
相关产品推荐

