来自 资讯 2022-06-08 05:20 的文章

美国高防_防御ddos收费_零误杀

美国高防_防御ddos收费_零误杀

优化git的合并机制,Palantir Followmar 8·14分钟阅读

编者注:这是Palantir软件工程师关于优化git的合并和重命名检测机制的系列文章中的第一篇。点击阅读第二篇文章。

过去,我谈到了我在Git中重命名和深层目录层次结构的工作。我提到了我将在git中为合并机制和重命名检测功能实现的一些性能改进。在这篇文章和随后的文章中,我想谈谈这些改进,这些改进是为git[1]贡献新合并算法的一部分。在本系列博客文章中,我将描述我对git所做的优化,我在Git Merge 2020演讲中幽默地总结如下:

不要做不必要的工作不要重做工作不要重做不必要的工作福吉"不必要"

但我可以更准确地总结为:

找到检测重命名不会改变结果的路径,ddos防御阿里云,不要为这些路径检测重命名不要寻找比完美匹配更好的匹配不要重复检测上游分支在对一系列提交(尤其是不要重复检测一开始就不必要的提交)重定基址时所做的相同重命名找到有用的启发式方法来指导重命名检测,以避免(或至少减少)暴力穷举两两比较

自从我的Git Merge 2020演讲以来,我已经完成了实现,并且还对上述优化做了一些改进,并添加了两组新的优化:

树级合并(看起来与重命名检测极不兼容,但有些技巧通常可以使其正常工作)良好、老式的优化工作-测量性能,查找缓慢的代码路径,并分别修复它们

本系列的第一个博客激发了我们在Palantir如何使用git以及我们为什么关心这些优化,然后提供了理解这些优化所需的背景知识,最后给出了第一个超级简单的优化:不要寻找比完美匹配更好的匹配(这本身就是对现有优化的改进,通过检测基于文件哈希的重命名来加速git合并,而不是查看文件内容)。

合并算法只是关于git合并吗?

合并机制在git(称为merge recursive)增强了git的几个方面:

mergecherry PickerBearEvertam-3stashcheckout-m

所以我们谈论的不仅仅是git merge。

为什么git的合并算法需要工作?

简言之:

我们需要对大型代码库进行有效重构我们想要转向稀疏操作并想要改进它们的性能有效性现有代码处于设计的极限

大型代码库的高效重构

在Palantir,我们有一些大型ish Monorepo,大致相当于linux内核的大小。在这些存储库中,我们有时会进行深度重构,包括重命名高级目录。我们希望git能够高效地处理此类工作。如果cherry挑选一个补丁将其回传到某个较老的分支,由于限制或需要非常长的时间而无法工作,人们将求助于手工补丁,并冒着丢失重要部分的风险。我们曾经遇到过这样一个案例:一个团队损失了大量时间,由于在涉及大量重命名的重构之后很难备份补丁,美国cdn高防,他们的工作慢了几个月。这导致他们召开了一次会议,要求达成协议,不再重构代码;这是一种相当不理想的状态,如果有更好的合并功能本可以避免。

稀疏性

除了重构工作流之外,我们希望开发人员能够专注于他们感兴趣的领域,就好像他们有一个更小的存储库一样。在git稀疏签出存在之前,阿里云ddos防御安装,我们创建了允许稀疏签出的脚本(因为稀疏签出本身是基于SKIP_WORKTREE功能的,该功能在git中已经存在很长时间了,但没有易于访问的UI),然后回顾了由Microsoft提供的git sparse checkout修补程序,并为该功能提供了几个我们自己的修补程序。

该领域的继续工作包括创建稀疏索引(也是由Microsoft牵头),这不仅可以使工作树稀疏,但git的索引(或暂存区域)也很稀疏。由于索引在git中是一种普遍存在的数据结构,因此这种更改需要在整个git代码库中进行重大更改。与大多数代码区域相比,现有的合并机制与索引的关联要复杂得多,而更改索引实际上是一次完全的重写。因此,稀疏索引工作将需要一种新的合并算法,这是我们的贡献。

与稀疏签出和稀疏索引的思想相联系的是部分克隆——只下载感兴趣路径的历史记录的能力。我一直对这个功能感兴趣,并且相信我是第一个发布一些补丁的人,这些补丁包含了稀疏克隆的基本实现。我从未完成该实现,但其他人最终创建了类似的功能。部分克隆将进行部分历史记录下载,然后在访问其他对象时延迟下载这些对象。当然,为了使部分克隆有用,它们需要避免以非优化的方式过于频繁地下载额外的对象,或者下载不必要的对象。遗憾的是,重命名检测可能需要下载过多的对象,尽管在某些情况下,其他方法有时可以在没有重命名检测的情况下解决问题,并避免下载过多的对象。因此,找到改进合并重命名检测的方法也是部分克隆性能的一个重要驱动因素。

设计限制