2012-11-13 96 views
5

我想给定的两个标记之间的变化,该命令是:为什么git log --cherry pick太慢了?

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

但它是非常缓慢的。

我分别逐个测试参数。只有当与--cherry-pick,git日志是非常缓慢的。

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

回答

1

--cherry-挑
省略任何承诺,介绍作为另一提交的“另一侧”当设定提交的与对称差限定的相同变化。例如,如果您有两个分支A和B,则通常只列出所有提交中的一个提交的方式是 - 左右对齐(请参阅下面的示例中的 描述 - 左右选项)。然而,它显示了从其他分支樱桃挑选的提交(例如,“分支B的第3条”可能是从分支A挑选的 )。使用这个选项,这样的提交对将从输出中排除。

它必须比较所有提交寻找相似之处 - 这将是一个非常缓慢的操作,而不必做任何比较。

+0

感谢您的答复,这是正确的。我看到这个手册页。不过,正如它所说的,我们打算省略其他分支上出现的变化。我们有其他方法而不是这个吗? –

+0

如果您使用合并而不是樱桃挑选,您可以做到这一点没有所有的开销。 – Michael

+0

是的,我知道,但问题代码库不是我们的工作,我们只是获取更改以分析某个组件的质量。我们无法控制sw开发者的行为。 –

0

我一直在使用

git log tag1 --not tag2 

这使我对TAG1所有提交不上TAG2。也适用于分支和标签。

-1

樱桃采摘可能不是那么快,因为它可能检测到重命名作为合并的一部分,这可能是昂贵的,特别是当你正在樱桃采摘远离HEAD的东西时。

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

git gc 

为了清理不必要的文件和优化本地资源库。

您也可以尝试将merge.renamelimit配置变量设置为较小的值(例如1,因为0意味着无限制)。如果这不起作用,请尝试对你的git进行分析(例如使用straceperf record git cherry-pick ...)并找出瓶颈。

参见:cherry-pick is slow

对于合并递归,我们总是要计算成对 每边和祖先之间的重命名。所以差异到 樱桃挑选目的地总是将是一个昂贵的O( 源和目标之间的变化#操作)。

没有重命名,你可以做更好的实际合并与 三向树步行。例如,你看到一些子树在 的树A中,oursancestor树,但是在树B中的theirs。所以你不必 不得不进一步下降,并可以只是说“拿他们”(嗯,你有 下降theirs获得值)。但我预计它会让更多的 与指数之间的互动变得复杂(并且可能不是 值得花费很多努力,因为重命名问题,无论如何)。

-Peff