Performance git版本列表有时速度较慢,有哪些替代方案?
我在生产中有一个工具,它在一个单一的大型回购上调用git rev list,每分钟调用10-30次。我发现git的响应时间差别很大,从大约1秒到50秒不等(在超时机制放弃git请求之前) 目标是查看这两个提交是否是祖先/后代,如果是,那么这两个提交中的哪一个是祖先。我做了一次这个调用,如果我得到了输出,我就有了答案,如果没有输出,我交换提交位置,然后再次运行。如果这次没有输出,则它们不是彼此的祖先/后代 有没有其他更有效的方法来查找这些信息?如果说到这一点,即使是关于在git之外的某些结构中对提交树进行建模的建议也值得赞赏Performance git版本列表有时速度较慢,有哪些替代方案?,performance,git,version-control,Performance,Git,Version Control,我在生产中有一个工具,它在一个单一的大型回购上调用git rev list,每分钟调用10-30次。我发现git的响应时间差别很大,从大约1秒到50秒不等(在超时机制放弃git请求之前) 目标是查看这两个提交是否是祖先/后代,如果是,那么这两个提交中的哪一个是祖先。我做了一次这个调用,如果我得到了输出,我就有了答案,如果没有输出,我交换提交位置,然后再次运行。如果这次没有输出,则它们不是彼此的祖先/后代 有没有其他更有效的方法来查找这些信息?如果说到这一点,即使是关于在git之外的某些结构中对提
谢谢。看看
git merge base first-sha1 second-sha1
。如果结果是第三个sha1,则它们不是后代。否则,结果就是较老的祖先
然而,如果你能在更高的层次上描述一些工作流程,可能有一种更简单的方法,你可能不必依赖它。我写了这篇关于每个特性的分支的文章:它可能会给你一些想法。看看
git merge base first-sha1 second-sha1
。如果结果是第三个sha1,则它们不是后代。否则,结果就是较老的祖先
然而,如果你能在更高的层次上描述一些工作流程,可能有一种更简单的方法,你可能不必依赖它。我写了这篇关于Branch per Feature的文章:它可能会给你一些想法。(甚至)使用以下功能会更快:
- ()
- Git 2.20(2018年第4季度)
(于2018年9月24日合并)
commit reach
:使用can\u all\u from\u reach
是以前在
中使用的方法的后代,该方法在中用于检查提交是否可以到达所提供列表中的任何提交。
这有两个性能问题:
in\u merge\u base()
调用需要遍历目标提交之外的区域,以便找到可能是合并基的完整边界提交集
can\u all\u from\u reach
方法避免了这种二次行为,并且可以使用生成编号将搜索限制在目标提交之外。
它需要一个小的原型调整来停止使用提交日期
作为截止日期,因为这种优化在这里不再合适
由于在_merge_base()
中使用了向下绘制到_common()
,是()的后代
自然找到了截断,以避免遍历整个提交图。
由于我们希望始终返回正确的结果,因此不能在can\u all\u from\u reach
中使用min\u commit\u date
截止值。然后,我们依靠代数来提供截止值
由于并非所有repo都会有提交图文件,我们也不会总是为提交图文件计算生成编号,因此创建一个新方法,generation\u numbers\u enabled()
,该方法检查提交图文件,并查看文件中的第一次提交是否具有非零生成编号。
如果没有生成编号,请使用is\u substant\u of()
的旧逻辑
使用“测试工具reach is_substant_of
”命令在Linux存储库的副本上测量性能,该命令使用以下输入:
A:v4.9
A:v4.9
B:v3.19
Before: 0.10 s
After: 0.08 s
X:v4.10
X:v4.11
X:v4.12
X:v4.13
X:v4.14
X:v4.15
X:v4.16
X:v4.17
X.v3.0
请注意,此输入是为了演示以前方法的二次性而定制的,因为它将在检查v4.1之前计算v4.9与所有更高版本的合并基数
Before: 0.26 s
After: 0.21 s
由于我们之前在ref\u newer
方法中使用了is\u substant\u of方法,因此我们还使用“测试工具reach ref\u newer
”对该方法的性能进行了测量,输入如下:
A:v4.9
A:v4.9
B:v3.19
Before: 0.10 s
After: 0.08 s
通过在父v3.19中添加一个新的提交,我们测试了不可到达的情况
更新的参考文献:
Before: 0.09 s
After: 0.08 s
在Git 2.20(2018年第4季度)之前,(实验性的)提交图文件的生成到目前为止是相当安静的,尽管它在一个有意义的大型存储库中花费了相当长的时间。
用户现在将看到进度输出。 参见(2018年9月19日)和(2018年9月17日)作者。
帮助人:马丁·奥格伦·马丁。agren@gmail.com.
(于2018年10月16日合并)
使用Git 2.21(2019年第一季度),该进度将更加准确: 参见。
帮助人:。
(于2019年1月14日合并)
commit graph
:拆分close\u reachable()
进度输出
修改在(“commit graph write
”中添加的进度输出:
添加进度输出”,2018-09-17),以便报告的总数
不再高于提交的总数。有关指出这一点的错误报告,请参阅 当我添加这个时,我并不打算提供准确的计数。但既然我们在展示数字,那就让我们来制作吧 准确的 ,即使在相当大的存储库上,如
linux.git
在我拥有的一个测试存储库上,有700万次提交 所有这些都会显示出来。他们中的两个不会出现很长时间,但是 这
而且(仍然是Git2.212019年第1季度),在写入提交图文件时显示进度表的代码路径已经得到了改进 参见,,,,(2019年1月19日)by.
参见(2019年1月23日)和(2019年1月19日)作者 (由合并)
$ ~/g/git/git --exec-path=$HOME/g/git commit-graph write
Finding commits for commit graph among packed objects: 100% (6529159/6529159), done.
Expanding reachable commits in commit graph: 815990, done.
Computing commit graph generation numbers: 100% (815983/815983), done.
Writing out commit graph in 4 passes: 100% (3263932/3263932), done.
$ git commit-graph write --reachable
Expanding reachable commits in commit graph: 138606% (824706/595), done.
[...]
$ git rev-parse v5.0 | git commit-graph write --stdin-commits
Expanding reachable commits in commit graph: 81264400% (812644/1), done.
[...]
git merge-base --is-ancestor <A> <B>
| A | B | Time Before | Time After |
|------|------|-------------|------------|
| v3.0 | v5.7 | 0.459s | 0.028s |
| v4.0 | v5.7 | 0.267s | 0.021s |
| v5.0 | v5.7 | 0.074s | 0.013s |
$ git commit-graph write --reachable
Expanding reachable commits in commit graph: 837569, done.
Writing out commit graph in 3 passes: 166% (4187845/2512707), done.