有人可以解释什么是SVN平分算法吗?理论上和通过代码片段



我想了解SVN平分/git-bisect算法是什么。我试图搜索在线资源,但无法获得良好的问题陈述和解决方案。

简而言之,平分的概念是一个二叉搜索

平分的概念基于几个假设:

  1. 有一个特定的应用程序行为(为简单起见,我们称之为"缺陷"(,您希望找到它的原因。
  2. 代码分析和调试需要太多的努力。
  3. 构建任何版本并针对它运行测试比代码分析和调试要容易得多。
  4. 您知道过去没有此缺陷的一些代码修订。

一种直接的方法是构建以前的修订版并测试它是否存在此缺陷。如果有,则提前测试一个修订版。您继续,直到找到引入此错误的修订版。您知道此提交中的所有更改。这就是为什么更容易找到导致缺陷的确切变化的原因。此外,调试可以容易得多,因为您可以专注于(通常(一些更改。

但是,如果已知没有缺陷的修订版在最近的修订版之前是过去的 200 个修订版,您可能需要重复"构建和测试"过程 200 次(如果您没有运气的话(。

我们将没有缺陷的修订版命名为 R0,将有缺陷的修订版命名为 R200。

平分允许使其更快。你"告诉"一分为二,什么修订有缺陷,什么修订没有缺陷。然后平分计算这些修订之间的提交次数。在我们的例子中,这是 200 次提交。Bisect 在有缺陷的修订之前获取 100 个修订的修订并将其检查出来。意味着,它检查出修订版 R100。您构建它并进行测试。然后你"告诉"平分这个修订版是否包含缺陷。如果存在缺陷,则意味着它是在版本R0和R100之间引入的。如果没有缺陷,则表示缺陷是在修订版 R100 之后,在 R100 和 R200 之间引入的。

假设您告诉平分 R100 中有缺陷。然后平分取范围 R0 - R100 的中间。这将是修订版 R50。平分检查一下。您构建它并测试并告诉结果一分为二。

假设 R50 没有缺陷。这意味着,它是在修订版 R50 和 R 100 之间引入的。平分再次取中间,修订版R75。您构建它并进行测试。

假设 R75 有缺陷。意味着它是在 R50 和 R75 之间引入的。平分检查出 R63。等等。

总共需要 log(200( = 8 个步骤。如果您检查每个版本,您将构建和测试多达 200 个修订版,这将花费更长的时间。

对于 Git,您首先使用命令启动平分过程

git bisect start

然后你签出有缺陷的修订版并运行命令

git bisect bad

然后你告诉平分什么是没有缺陷的修订:

git bisect good R0

通过这个命令,Git 平分将找到中间的 R100,并检查出来。您构建并测试它,如果它包含缺陷,则运行命令

git bisect bad

否则命令

git bisect good

因此,继续,直到您发现引入缺陷的修订版。

相关内容

最新更新