5

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

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

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

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

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

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

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

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

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

4

2 回答 2

2

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 之间的任何其他代码。这可用于避免检查由于任何原因不适合的提交。

于 2020-04-08T01:47:49.630 回答
0

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

git bisect good $(git rev-list \
        --ancestry-path --boundary agoodone..thebadone | sed -n s/-//p)
于 2020-04-09T08:52:45.053 回答