【问题标题】:Keeping git bisect on the ancestry path将 git bisect 保持在祖先路径上
【发布时间】:2020-07-19 22:00:26
【问题描述】:

我有一个包含复杂分支和合并树的存储库,我想使用 git bisect 来查找何时引入了错误。

我有一个好的提交和坏的提交来开始平分,其中好的提交是坏提交的祖先。

我希望 git bisect 去提交具有良好提交作为祖先的提交,但它没有(使用 git 2.21.0)。

目前,我通过保留提交列表并使用git rev-list --ancestry-path GOOD..BAD 并在中间选择一个提交来手动进行平分。有没有办法使用git bisect 自动执行此操作?它有没有保留在祖先路径中的标志?

首先在祖先路径中二等分的推理

与正在搜索的错误相关的功能可能并不存在于所有分支中,因此检查在那里无关紧要。但它们应该存在于祖先路径中。

一旦完成对祖先路径的二分,一个人可能会得到一个合并提交作为责备,他们会知道这个错误来自那个分支。这已经教会了人们很多关于这个错误的知识。

要继续对引入错误的分支进行二等分,不需要单独测试每个提交(因为它们不一定具有出现错误所需的功能),但应该将每个提交与最后一次好的提交,然后检查错误是否存在。然后可以查明一个特定的提交,当它与好的提交合并时,会引入错误。

请注意,我已经多次完成此过程,它对我非常有用,我只是在寻找使其更方便的方法。

【问题讨论】:

    标签: git git-bisect


    【解决方案1】:

    git bisect 没有遵循祖先路径的选项。由于以下几个原因,这样的选项通常没有用处:

    • 大多数情况下,用户不确定引入回归的位置。因此,不太可能使用控制路径遍历的复杂选项。
    • 在大多数情况下,您会忽略大量可能的分支,因为您会跳过它们。如果您有 1024 个单独的分支,其中一个提交合并到您的 master 分支中,git bisect 将忽略其中的一半,甚至在第一次测试后考虑,仍然只需要运行 12 次即可找到有问题的提交。李>
    • 通常,有问题的提交位于合并的分支上,而不是祖先路径上。对于大多数没有线性历史记录的情况(即基于合并的工作流程),情况确实如此。

    除非您对您的存储库有特定的了解,以至于不在祖先路径上的提交会产生误报或误报,否则让git rebase 做它通常没问题。由于它的行为是 O(log N),因此额外的成本往往可以忽略不计。但是,如果需要,您可以使用 git bisect skip RANGE 指定要跳过的范围。

    如果您可以使用 shell 脚本或命令自动测试您的分支,则可以将 git bisect run 与该 shell 脚本一起使用。如果提交是好的,它应该退出 0,如果应该跳过提交,它应该退出 125,如果提交是错误的,它应该退出 1 到 127 之间的任何其他代码。这可用于避免检查由于任何原因不适合的提交。

    【讨论】:

    • 我在回答中添加了“推理”部分,以解释为什么这样的选项(实际上应该是默认的恕我直言)很有用。
    • 我已经更新了我的答案,以解释如果您可以编写测试脚本,如何使用 git bisect run 来做您想做的事情。我的回答仍然成立:Git 没有这个功能,上游可能会告诉你我提到的为什么它没有。
    【解决方案2】:

    您可以使用现有的 bisect 轻松完成此操作,而不是 git bisect good agoodone do

    git bisect good $(git rev-list \
            --ancestry-path --boundary agoodone..thebadone | sed -n s/-//p)
    

    【讨论】:

    • 我不明白,那不是把所有的祖先路径都标记为好了吗?
    • 哎呀,删除了我之前的评论,我完全误读了您的评论。不,sed 只选择边界提交,所有 rev-list 没有进一步检查的提交,因为它们不在祖先路径上。所以这只是明确提供祖先路径选项找到的边界提交
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2011-03-11
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多