为什么git log --cherry-pick是如此之慢?

时间:2012-11-13 01:23:13

标签: git performance git-cherry-pick

我想获得两个给定标签之间的更改,命令是:

git log `Tag1...Tag2 --cherry-pick  --no-merges --right-only

但速度很慢。

我逐个测试参数。只有当--cherry-pick时,git log非常慢。

为什么呢?有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

  

- 樱桃挑选
  当提交集受限于对称差异时,省略任何引用与“另一方”上的另一个提交相同的更改的提交。

     

例如,如果您有两个分支A和B,通常只在一侧列出所有提交的方法是--left-right(请参阅下面的示例)    --left-right选项的描述)。然而,它显示了从另一个分支中挑选出来的提交(例如,“b上的第3个”可能是    樱桃采摘从分支A)。使用此选项,这些提交对将从输出中排除。

它必须比较所有寻找相似性的提交 - 与完全没有进行任何比较相比,这将是一个非常慢的操作。

答案 1 :(得分:0)

我一直在使用

git log tag1 --not tag2

这让我对tag1的所有提交都不在tag2上。适用于分支和标签。

答案 2 :(得分:-1)

樱桃采摘可能不会那么快,因为它可能会将重命名视为合并的一部分,这可能很昂贵,尤其是当你挑选远离HEAD的东西时。

可能是你的git配置有gc.auto = 0git config --get gc.auto),所以要仔细检查它是否已启用,或者只是运行:

git gc

为了清理不必要的文件并优化本地存储库。

您也可以尝试将merge.renamelimit配置变量设置为较小的值(例如1,因为0表示无限制)。如果这样做无效,请尝试分析您的git(例如,使用straceperf record git cherry-pick ...)并找出瓶颈。

请参阅:cherry-pick is slow

  

对于merge-recursive,我们总是希望计算成对的   在每一方和祖先之间重命名。所以差异到了   樱桃挑选目的地总是一个昂贵的O(#   源和目标之间的变化。

     

如果没有重命名,你可以在实际合并时做得更好   三路树步行。例如,你看到一些子树位于树A中   oursancestor树,但在theirs的树B。所以你没有   必须进一步下降,可以说“拿他们的”(好吧,你有   下降theirs以获取值)。但我希望它会变得更多   与索引的交互很复杂(可能不是   因为重命名问题,无论如何都值得花费很多精力)。

     

-Peff