Git 2.41 源代码控制系统可用

经过三个月的开发,分布式源码控制系统Git 2.41已经发布。 Git 是最流行、可靠和高性能的版本控制系统之一,提供基于分支和合并的灵活的非线性开发工具。 为了确保历史记录的完整性和对追溯更改的抵抗力,在每次提交中都会使用整个先前历史记录的隐式哈希;还可以使用开发人员的数字签名来验证各个标签和提交。

与之前版本相比,新版本包含 542 处变更,由 95 名开发人员参与准备,其中 29 名开发人员首次参与开发。 主要创新点:

  • 改进了对存储库中未引用的不可访问对象(未由分支或标签引用)的处理。 无法访问的对象由垃圾收集器删除,但在删除之前会在存储库中保留一段时间,以避免竞争情况。 为了跟踪不可达对象的出现周期,需要给它们附加类似对象的变化时间的标签,这不允许将它们存储在一个所有对象都有共同变化时间的包文件中。 以前,每个无法访问的对象都存储在单独的文件中,当存在大量尚不符合删除条件的新的无法访问的对象时,这会导致问题。 在新版本中,默认使用“cruft packs”机制来打包不可达对象,它允许您将所有不可达对象存储在一个包文件中,并且每个对象的修改时间数据反映在一个单独的表中,存储位于扩展名为“.mtimes”的文件中,并使用扩展名为“.idx”的索引文件进行链接。
    Git 2.41 源代码控制系统可用
  • 默认情况下启用在磁盘上维护包文件的反向索引。 在torvalds/linux存储库上进行测试时,使用反向索引可以将资源密集型的“git推送”操作加速1.49倍,以及使用“git cat-”计算单个对象的大小等简单操作file —batch='%(objectsize:disk)' "77 次。 具有反向索引的文件(“.rev”)将存储在存储库中的“.git/objects/pack”目录中。

    回想一下,Git 以对象的形式存储所有数据,这些数据位于单独的文件中。 为了提高使用存储库的效率,对象另外放置在包文件中,其中信息以对象流的形式呈现,这些对象相互跟随(使用 git fetch 和 git push 传输对象时使用类似的格式)命令)。 对于每个包文件,都会创建一个索引文件 (.idx),它允许您使用对象标识符快速确定包文件中存储给定对象的偏移量。

    新版本中包含的反向索引旨在优化根据有关对象在包文件中的位置的信息确定对象标识符的过程。 以前,这种转换是在解析包文件时动态执行的,并且仅存储在内存中,这不允许重复使用类似的索引,并且每次都强制生成索引。 构建索引的操作归结为构建一个对象位置对数组并按位置对其进行排序,这对于大型包文件来说可能需要很长时间。

    例如,使用直接索引显示对象内容的操作比未对位置到对象数据建立索引的显示对象大小的操作快 62 倍。 使用反向索引后,这些操作开始花费大约相同的时间。 反向索引还允许您在执行获取和推送命令时通过直接从磁盘传输现成的数据来加速对象发送操作。

    Git 2.41 源代码控制系统可用

  • “凭据帮助程序”协议用于在访问具有有限访问权限的存储库时传输凭据,它增加了对在凭据处理程序和执行身份验证的服务之间传递 WWW-Authenticate 标头的支持。 对 WWW-Authenticate 标头的支持允许您传递 OAuth 范围参数,以便更精细地分离用户对存储库的访问以及可用于请求的范围的界定。
  • 在 for-each-ref 命令中添加了格式化选项“%(ahead-behind:”: )”,它允许您立即获取有关某个分支相对于另一个分支的存在或不存在的提交数量的信息(一个分支在提交级别落后或领先于另一个分支的数量)。 以前,要获取此类信息,您需要运行两个单独的命令:“git rev-list —count main..my-feature”以获取分支特有的提交数量,以及“git rev-list —count my-feature” ..main”来获取缺失提交的数量。 现在,此类计算可以简化为单个命令,从而简化了处理程序的编写并减少了执行时间。 例如,要显示尚未合并的分支并评估它们是在主分支之后还是之前,您可以使用单行: $ git for-each-ref —no-merged=origin/HEAD \ —format ='%(refname:short) %(前后:origin/HEAD)' \refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—排除 16 96 tb/roaring-bitmaps 47 3 而不是以前使用的脚本,该脚本运行速度慢了 17 倍: $ git for-each-ref — format='%(refname:short)' —no-merged=origin/HEAD \ refs/heads/tb | while read ref do advance="$(git rev-list -count origin/HEAD..$ref)" Behind="$(git rev-list -count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" 完成 | 列 -t tb/cruft-extra-tips 2 96 tb/for-each-ref — 排除 16 96 tb/roaring-bitmaps 47 3
  • “-porcelain”选项已添加到“git fetch”命令中,指定后,将以以下格式生成输出: ”,可读性较差,但更方便在脚本中解析。
  • 添加了“fetch.hideRefs”设置,该设置允许您在检查服务器是否已发送全套对象的阶段隐藏本地存储库中的一些引用,从而加快“git fetch”操作的速度,从而节省时间将检查仅限于直接检索数据的服务器。 例如,当在包含大量跟踪外部链接的存储库的系统上运行测试时,排除除发送到目标服务器 $remote 的链接之外的所有链接可将 git fetch 操作的执行时间从 20 分钟减少到 30 秒。 $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ 获取 $remote
  • “git fsck”命令提供了检查可访问位图和反向索引中的损坏、校验和合规性以及值的正确性的能力。
  • 现在,当尝试从 $GIT_DIR 中包含符号链接的存储库进行复制时,“git clone --local”命令会显示错误。

来源: opennet.ru

添加评论