Performance git版本列表有时速度较慢,有哪些替代方案?

Performance git版本列表有时速度较慢,有哪些替代方案?,performance,git,version-control,Performance,Git,Version Control,我在生产中有一个工具,它在一个单一的大型回购上调用git rev list,每分钟调用10-30次。我发现git的响应时间差别很大,从大约1秒到50秒不等(在超时机制放弃git请求之前) 目标是查看这两个提交是否是祖先/后代,如果是,那么这两个提交中的哪一个是祖先。我做了一次这个调用,如果我得到了输出,我就有了答案,如果没有输出,我交换提交位置,然后再次运行。如果这次没有输出,则它们不是彼此的祖先/后代 有没有其他更有效的方法来查找这些信息?如果说到这一点,即使是关于在git之外的某些结构中对提

我在生产中有一个工具,它在一个单一的大型回购上调用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月21日),(2018年8月28日)和(2018年7月20日).
(于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.