设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
修补
调试
电子邮件
外部系统
服务器管理员
2.40.1→2.45.2无变化 -
2.40.0 03/12/23 2.38.1→2.39.5无变化 -
2.38.0 2022年2月10日 2.33.1→2.37.7无变化 -
2.33.0 08/16/21 2.31.1→2.32.7无变化 -
2.31.0 03/15/21
背景
-
完整性检查很容易。 例如,位翻转很容易 检测到,因为损坏内容的散列与其名称不匹配。 -
对象查找速度很快。
-
对象名可以签名,第三方可以将哈希信任为 处理签名对象及其引用的所有对象。 -
使用Git协议的通信和带外通信 方法有一个短的可靠字符串,可用于可靠地 地址存储的内容。
哈希的选择
-
256位散列(长度足以匹配常见安全实践;不是 过长会影响性能和磁盘使用)。 -
应广泛提供高质量的实施(例如 OpenSSL和Apple CommonCrypto)。 -
哈希函数的属性应符合Git的需要(例如Git 需要碰撞和第二次预成像阻力,而不需要 长度延伸阻力)。 -
作为一个tiebreaker,散列的计算速度应该很快(幸运的是 许多竞争者比SHA-1更快)。
目标
-
可以一次在一个本地存储库中转换到SHA-256。 -
不需要任何其他方采取行动。 -
SHA-256存储库可以与SHA-1 Git服务器通信 (推/取)。 -
用户可以对对象使用SHA-1和SHA-256标识符 可互换(请参阅下面的“命令行上的对象名称”)。 -
新签名的对象使用了比 SHA-1的安全保证。
-
-
允许从SHA-1完全过渡。 -
SHA-1兼容性的本地元数据可以从 存储库,如果不再需要与SHA-1兼容。
-
-
整个过程的可维护性。 -
对象格式保持简单和一致。 -
创建通用存储库转换工具。
-
非目标
-
向Git协议添加SHA-256支持。 这很有价值 下一步是合理的,但这超出了初始设计的范围。 -
透明地提高已签署的现有SHA-1的安全性 物体。 -
在单个对象中使用多个哈希函数混合对象 存储库。 -
抓住机会修复Git格式中的其他错误 协议。 -
浅层克隆并提取到SHA-256存储库中。 (这将 当我们将SHA-256支持添加到Git协议时发生更改。) -
跳过将项目的一些子模块提取到SHA-256中 存储库。 (这还取决于Git中的SHA-256支持 协议。)
概述
详细设计
存储库格式扩展
[核心] repositoryFormatVersion=1 [扩展] objectFormat=sha256 compatObjectFormat=sha1
#在v0.99.9l和v2.7.0之间 $git状态 致命错误:预期的git repo版本<=0,找到1 #v2.7.0之后 $git状态 致命:发现未知的存储库扩展: 对象格式 兼容对象格式
对象名称
对象格式
对象存储
包装索引
-
页眉显示在开头,由以下内容组成: -
4字节压缩索引签名: \377吨 -
4字节版本号:3 -
标头部分的4字节长度,包括签名和 版本号 -
包中包含的4字节对象数 -
此包索引中的4字节对象格式数:2 -
对于每个对象格式: -
4字节格式标识符(例如。, 沙阿1 对于SHA-1) -
缩短对象名称的4字节长度(以字节为单位)。 这是 在缩短的中命名所需的尽可能短的长度 对象名称表毫不含糊。 -
4字节整数,记录与此格式相关的表格 存储在此索引文件中,作为与开头的偏移量。
-
-
从文件开头到尾部的4字节偏移量。 -
零个或多个附加键/值对(4字节键,4字节 值)。 仅支持一个密钥: PSRC公司 参见“松散物体 “and unreachable objects”部分,了解受支持的值以及如何 使用。 保留所有其他密钥。 读者必须忽略 无法识别的键。
-
-
零个或多个NUL字节。 这可以选择性地用于改进 下面完整对象名称表的对齐方式。 -
第一种对象格式的表: -
简短对象名称的排序表。 这些是的前缀 打包在一起的此打包文件中所有对象的名称 没有偏移值以减少二进制文件的缓存占用空间 搜索特定的对象名称。 -
按打包顺序列出完整对象名称的表。 这允许解决 对“包文件中的第n个对象”的引用(来自 可达位图或从另一个对象的下一个表 格式)设置为其对象名。 -
将对象名称顺序映射到打包顺序的4字节值表。 对于排序的简短对象名称表中的对象 此表中相应索引处的值是 同一对象的上一个表。 这可以用于在可达位图或 以其他对象格式查找其名称。 -
压缩对象数据的4字节CRC32值表,位于 对象在包文件中出现的顺序。 这是为了允许 压缩数据将在 在没有未检测到的数据损坏的情况下重新打包。 -
4字节偏移值表。 对于表中的对象 排序缩短的对象名称,对应的值 此表中的索引指示该对象可以在何处找到 包文件。 这些通常是31位压缩文件偏移量,但 大偏移量被编码为下一个表的索引 最高有效位集。 -
包含8字节偏移项的表(对于小于 2 GiB)。 打包文件是用大量使用的对象组织的 前面,所以大多数对象引用不需要引用 这张桌子。
-
-
零个或多个NUL字节。 -
第二种对象格式的表,其布局与上述相同, 不包括CRC32值表。 -
零个或多个NUL字节。 -
拖车由以下部件组成: -
结束时20字节SHA-256校验和的副本 相应的包文件。 -
20字节SHA-256校验和。
-
松散对象索引
#松散对象idx (sha256-名称SP sha1-名称LF)*
-
像今天一样,将松散对象写入临时文件。 -
使用O_CREAT|O_EXCL打开lose-object-idx.lock以获取锁。 -
将松散对象重命名到位。 -
用O_APPEND打开lose-object-idx并写入新对象 -
取消链接loose-object-idx.lock以释放锁定。
-
使用O_CREAT|O_EXCL打开lose-object-idx.lock以获取 锁定。 -
将新内容写入loose-object-idx.lock。 -
取消链接任何要移除的松散对象。 -
重命名以替换lose-object-idx,释放锁。
翻译表
-
在idx文件中查找对象。 如果在 idx的截断SHA-1名称排序列表,然后: -
阅读要打包的SHA-1名称顺序中的相应条目 名称顺序映射。 -
读取完整SHA-1名称表中的相应条目以 确认我们找到了正确的对象。 如果是,那么 -
读取完整SHA-256名称表中的相应条目。 这是对象的SHA-256名称。
-
-
检查有无松动的物体。 读取lose-object-idx中的行,直到 我们找到了匹配项。
提取
-
index-pack:膨胀包文件中的每个对象并计算其 SHA-1。 对象可以包含OBJ_REF_DELTA格式的增量 客户端在本地拥有的对象。 可以查找这些对象 使用转换表及其SHA-1内容读取为 如上所述,以解决增量。 -
拓扑排序:从谈判中的“需要”开始 阶段,遍历包中的对象并发出它们的列表, 以反向拓扑排序顺序排除blob,每个blob 对象在列表中的位置晚于它引用的所有对象。 (此列表仅包含可从“wants”访问的对象。如果 来自服务器的包包含其他无关对象,然后 它们将被丢弃。) -
转换为SHA-256:打开一个新的SHA-255包文件。 从拓扑结构上阅读 刚刚生成的排序列表。 对于每个对象,将其充气 SHA-1内容,转换为SHA-256内容,并将其写入SHA-256 打包。 记录新的SHA-1←→SHA-256映射条目,以便在idx中使用。 -
排序:重新排序新包中的条目以匹配对象的顺序 在包中,服务器生成并包含blob。 编写SHA-256 idx 文件 -
清理:删除基于SHA-1的包文件、索引和 在步骤1中从服务器获得的拓扑排序列表 和2。
签署的承诺
-
仅使用SHA-1,就像在现有的签名提交对象中一样 -
通过同时使用gpgsig-sha256和gpgsig,同时使用SHA-1和SHA-256 领域。 -
只使用SHA-256,只使用gpgsig-sha256字段。
签名的标记
-
仅使用SHA-1,如在现有的签名标记对象中 -
同时使用SHA-1和SHA-256,通过使用gpgsig-sha256和体内 签名。 -
只使用SHA-256,只使用gpgsig-sha256字段。
松散物体和无法触及的物体
-
1(PACK_SOURCE_RECEIVE)表示通过网络接收的包 -
2(PACK_SOURCE_AUTO)表示由轻量级 “gc--自动”操作 -
3(PACK_SOURCE_GC)用于由完整GC创建的包 -
4(PACK_SOURCE_UNREACHABLE_GARBAGE)用于潜在垃圾 由gc发现 -
5(PACK_SOURCE_INSERT),用于本地创建的对象 直接写入包文件,例如从“git add”中写入
注意事项
无效的对象
git注释
服务器端成本
签名的含义
对象e7e07d5a4fcc2a203d9873968ad3e6bd4d7419d7 类型commit 标签v2.12.0 标记员Junio C Hamano< gitster@pobox.com > 1487962205 -0800
基特2.12
命令行上的对象名称
-
(“暗启动”)将用户输入的对象名称视为SHA-1和 将写入输出的任何对象名称转换为SHA-1,但存储 对象使用SHA-256。 这允许用户在没有 可见的行为变化,性能除外。 这允许 运行假设SHA-1哈希函数的偶数测试,以 健全性检查新模式的行为。 -
(“早期转换”)允许SHA-1和SHA-256对象名 输入。 写入输出的任何对象名称都使用SHA-1。 这允许 用户继续使用SHA-1与对等方进行通信 (例如通过电子邮件)尚未迁移并为模式3做准备。 -
(“后期转换”)允许SHA-1和SHA-256对象名 输入。 写入输出的任何对象名称都使用SHA-256。 在这个 模式下,用户使用更安全的对象命名方法 违约。 只要他们的大多数同龄人 处于模式2或模式3。 -
(“转换后”)将用户输入的对象名称视为 SHA-256,并使用SHA-256写入输出。 这比模式3更安全 因为输入被错误解释的风险较小 使用了错误的散列函数。
git—输出格式=sha1 log abac87a^{sha1}。。 f787cac^{sha256}
过渡计划
-
添加散列函数API(vtable) -
教fsck容忍gpgsig-sha256字段 -
将gpgsig-*从“git commit--modify”复制的字段中排除 -
用SHA1测试注释依赖于SHA-1值的测试 先决条件 -
使用“struct object_id”、GIT_MAX_RAWSZ和GIT_MAX_HEXSZ 一致地而不是“unsigned char”和硬编码 常数20和40。 -
引入索引v3 -
添加对PSRC字段的支持和更安全的对象修剪
-
教fsck关于这种操作模式 -
计算对象名称时使用散列函数API(vtable) -
对对象签名并验证签名 -
拒绝从不兼容的 储存库
-
实现lose-object-idx -
在对象格式之间转换对象名称 -
在对象格式之间转换对象内容 -
生成和验证compat格式的签名 -
将新对象添加到 对象存储 -
--输出格式选项 -
^{sha1}和^{sha256}修订符号 -
配置以指定默认输入和输出格式(请参阅 上面的“命令行上的对象名称”)
-
允许使用compat格式推送到存储库 -
生成提取的SHA-1名称的拓扑排序列表 物体 -
将获取的包文件转换为SHA-256格式并生成idx 文件 -
重新排序以匹配获取的包文件中对象的顺序
考虑的备选方案
在升旗日升级参与特定项目的每个人
并行使用散列函数
-
您不能将其历史记录(可分性所需)信任于 没有进一步工作的未来 -
随着支持的哈希函数数量的增加,维护负担也随之增加 (它们永远不会消失,所以会积累)。 在本提案中,由 比较后,转换的对象将丢失对SHA-1的所有引用。
具有多个哈希的签名对象
-
使用一个签名而不是两个签名可以加快签名过程。 -
有一个带有两个散列的签名有效负载,签名者可以 证明SHA-1名称和SHA-256名称引用同一对象。 -
所有用户使用相同的签名。 签名可能损坏 使用当前版本的git快速检测。
-
验证签名对象需要访问所有 它引用的对象,即使在转换完成之后 其他任何东西都不再需要翻译表。 为了支持 这样,该设计添加了诸如“hash sha1 tree<SHA-1 name>”之类的字段 并将“hash sha1 parent<SHA-1 name>”添加到已签名的 提交,使转换过程复杂化。 -
允许不带SHA-1的签名对象(对于转换后 完整)使设计更加复杂,需要“nohash sha1” 字段以禁止在SHA-256内容中包含“hash sha1”字段 和签名有效载荷。
文档历史记录
-
描述每个哈希类型的签名对象的用途 -
使用 第一散列函数
-
使用SHA3-256代替SHA2(谢谢,莱纳斯和布莱恩·卡尔森)。 [1][2] -
使基于SHA3的签名成为单独的字段,避免了 “hash”和“nohash”字段(多亏了peff[3])。 -
添加一个排序阶段以获取(感谢Junio注意到了这一需要 为此)。 -
在获取期间从拓扑排序中忽略blob(多亏了peff)。 -
在注意事项中讨论备用、git注释和git服务器 部分(感谢Junio Hamano、brian m.carlson[4]和Shawn 皮尔斯)。 -
澄清整个过程中的语言(感谢各种评论, 尤其是朱尼奥)。
-
使用占位符NewHash代替SHA3-256 -
描述选择哈希函数的标准。 -
包括过渡计划(特别感谢Brandon Williams 充实这些想法) -
定义翻译表(谢谢,肖恩·皮尔斯[5],乔纳森 Tan和Masaya Suzuki) -
通过更积极地打包,避免松散的物体开销 “git-gc--自动”
-
有关后续文件的历史记录,请参阅git.git中此文件的历史 编辑。 此文档历史记录不再保留为 现在对提交日志来说是多余的
[1] https://lore.kernel.org/git/CA网站 +55aFzJtejiCjV0e43型+ 9oR3QuJK2PiFiLQemytoLpyJWe6P9w@mail.gmail.com / [2] https://lore.kernel.org/git/CA网站 +55华氏度+ gkAsDZ24zmePQuEs1XPS9BP_s8O7Q4wQ7LV7X5-oDA@mail.gmail.com / [3] https://lore.kernel.org/git/20170306084353.nrns455dvkdsfgo5 @sigill.intra.peff.net公司/ [4] https://lore.kernel.org/git/2017304224936.rqqtkdvfjgyezsht @genre.crustytohspaste.net [5] https://lore.kernel.org/git/CAJo=hJtoX9=AyLHHpUJS7fueV9ciZ_MNpnEPHUz8Whui6g9F0A @邮箱.gmail.com/