bisect

简介

使用二分搜索来查找引入错误的提交。

vb bisect SUBCOMMAND [OPTIONS]

示例

  • 当项目出现错误,首先查看当前项目 trunk 分支时间线:

$ vb timeline trunk
=== 2024-07-22 ===
11:26:49 [e5da7b822c] *CURRENT* 提交 (user: 36657 tags: trunk)
10:58:36 [fda0e8b422] test7提交 (user: 36657 tags: trunk)
10:57:08 [6c7a333eb9] demo1提交 (user: 36657 tags: demo1)
10:56:00 [285e6b4715] Create new branch named "demo1" (user: 36657 tags: demo1)
10:55:35 [b921c6d805] *BRANCH* test6提交 (user: 36657 tags: trunk)
10:55:20 [acd041bf3f] test5提交 (user: 36657 tags: trunk)
10:55:05 [04ce08bef9] test4提交 (user: 36657 tags: trunk)
10:54:36 [30e084fca3] test3提交 (user: 36657 tags: trunk)
10:53:46 [32739c4a6e] reunk分支提交 (user: 36657 tags: trunk)
10:52:58 [631d5f28d7] test1,test2提交 (user: 36657 tags: trunk)
10:51:47 [4e5f9800f9] initial empty check-in (user: 36657 tags: trunk)
+++ no more data (11) +++
  • 已知 fda0e8b422 版本是包含错误提交,标记为 bad631d5f28d7 版本是未包含错误的版本,标记为 goodauto-next 为打开状态:

$ vb bisect bad fda0e8b422
$ vb bisect good 631d5f28d7
UPDATE test1.txt
REMOVE test5.txt
REMOVE test6.txt
REMOVE test7.txt
-------------------------------------------------------------------------------
updated-from: e5da7b822cd30ffb32df00b48ca36c7a8f46216b 2024-07-22 11:26:49 UTC
updated-to:   04ce08bef9526058c7ad86acd2d88d87aa8d0574 2024-07-22 10:55:05 UTC
tags:         trunk
comment:      test4提交 (user: 36657)
changes:      4 files modified.
 "vb undo" is available to undo changes to the working checkout.
span: 6  steps-remaining: 3
  1 BAD     2024-07-22 10:58:36 fda0e8b422c8e4a9
  3 CURRENT 2024-07-22 10:55:05 04ce08bef9526058
  2 GOOD    2024-07-22 10:52:58 631d5f28d7399915
  • 当前签出版本为 04ce08bef9526058 ,编译签出的版本并进行测试,测试正常,标为 good:

$ vb bisect good
ADD test5.txt
ADD test6.txt
-------------------------------------------------------------------------------
updated-from: 04ce08bef9526058c7ad86acd2d88d87aa8d0574 2024-07-22 10:55:05 UTC
updated-to:   b921c6d805ab6b85e5f2ef50d2722ffa10f33396 2024-07-22 10:55:35 UTC
tags:         trunk
comment:      test6提交 (user: 36657)
changes:      2 files modified.
 "vb undo" is available to undo changes to the working checkout.
span: 3  steps-remaining: 2
  1 BAD     2024-07-22 10:58:36 fda0e8b422c8e4a9
  4 CURRENT 2024-07-22 10:55:35 b921c6d805ab6b85
  3 GOOD    2024-07-22 10:55:05 04ce08bef9526058
  2 GOOD    2024-07-22 10:52:58 631d5f28d7399915
  • 当前签出版本为 b921c6d805ab6b85 ,编译签出的版本并进行测试,测试有错,标为 bad:

$ vb bisect bad
REMOVE test6.txt
-------------------------------------------------------------------------------
updated-from: b921c6d805ab6b85e5f2ef50d2722ffa10f33396 2024-07-22 10:55:35 UTC
updated-to:   acd041bf3f6a57ea5109aeb761f93271e741a15c 2024-07-22 10:55:20 UTC
tags:         trunk
comment:      test5提交 (user: 36657)
changes:      1 file modified.
 "vb undo" is available to undo changes to the working checkout.
span: 2  steps-remaining: 1
  1 BAD     2024-07-22 10:58:36 fda0e8b422c8e4a9
  4 BAD     2024-07-22 10:55:35 b921c6d805ab6b85
  5 CURRENT 2024-07-22 10:55:20 acd041bf3f6a57ea
  3 GOOD    2024-07-22 10:55:05 04ce08bef9526058
  2 GOOD    2024-07-22 10:52:58 631d5f28d7399915
  • 列出最近 badgood 之间所有版本:

$ vb bisect ls --all
2024-07-22 10:55:35 b921c6d805 BAD
2024-07-22 10:55:20 acd041bf3f CURRENT NEXT
2024-07-22 10:55:05 04ce08bef9 GOOD
  • 当前签出版本为 acd041bf3f6a57ea ,编译签出的版本并进行测试,测试有错,标为 bad:

$ vb bisect bad
REMOVE test6.txt
-------------------------------------------------------------------------------
updated-from: b921c6d805ab6b85e5f2ef50d2722ffa10f33396 2024-07-22 10:55:35 UTC
updated-to:   acd041bf3f6a57ea5109aeb761f93271e741a15c 2024-07-22 10:55:20 UTC
tags:         trunk
comment:      test5提交 (user: 36657)
changes:      1 file modified.
 "vb undo" is available to undo changes to the working checkout.
span: 2  steps-remaining: 1
  1 BAD     2024-07-22 10:58:36 fda0e8b422c8e4a9
  4 BAD     2024-07-22 10:55:35 b921c6d805ab6b85
  5 CURRENT 2024-07-22 10:55:20 acd041bf3f6a57ea
  3 GOOD    2024-07-22 10:55:05 04ce08bef9526058
  2 GOOD    2024-07-22 10:52:58 631d5f28d7399915
  • 二分法结束,当前签出版本为 acd041bf3f6a57ea ,出错版本为最后一次标为 bad 标签 acd041bf3f6a57ea 版本,显示该版本信息:

$ vb blame -r acd041bf3f6a57ea -w test5.txt
acd041bf3f 2024-07-22         36657: test5
  • 清理二分状态,取消之前的所有二分历史记录,返回到二分查找开始的状态:

$ vb bisect reset
  • 将当前签出版本恢复到最新版本:

$ vb update
UPDATE test1.txt
UPDATE test5.txt
ADD test6.txt
ADD test7.txt
-------------------------------------------------------------------------------
updated-from: acd041bf3f6a57ea5109aeb761f93271e741a15c 2024-07-22 10:55:20 UTC
updated-to:   e5da7b822cd30ffb32df00b48ca36c7a8f46216b 2024-07-22 11:26:49 UTC
tags:         trunk
comment:      提交 (user: 36657)
changes:      4 files modified.
 "vb undo" is available to undo changes to the working checkout.

说明

当项目出现问题时可能需要对签入的历史记录进行查找,该命令使用二分搜索算法来查找项目历史记录中引入错误的提交。

使用时,首先指定一个已知包含错误的 bad 提交和一个已知在引入错误之前的 good 提交,vb bisect next 将从这两个端点的历史记录范围中二分搜索出一个提交,将其签出。然后编译签出的版本并进行测试。如果该版本运行正常,则需要将该版本标识为 good ,否则为 bad 。 选择后,它会缩小范围,继续 next 进行二分查找。不断重复该过程:编译树,测试它,并根据它是好是坏来运行 vb bisect goodvb bisect bad 要求下一个需要测试的提交,直到找到引入更改的确切提交。

当不再有需要检查的提交版本时,最后一个 vb bisect next 会显示 bisect complete 并且按签入顺序显示所有标为 goodbadskip 的版本,按测试顺序最后一个标为 bad 的版本为引入错误的提交。

事实上,vb bisect 可用于查找更改项目任何属性的提交;例如,修复错误的提交,或导致基准测试性能提高的提交。

子命令

bad

vb bisect bad [VERSION]

将指定版本的工程标识为 bad,表示该版本包含错误。如果省略 VERSION ,则该签出工程将被标记为 bad

good

vb bisect good [VERSION]

将指定版本的工程标识为 good,表示该版本是正常的。如果省略 VERSION ,则该签出工程将被标记为 good

skip

vb bisect skip [VERSION]

如果指定版本的工程无法正确编译或不适合参与此二分法,使用此命令将该版本的工程跳过,在接下来的二分法中忽略此版本。

next

vb bisect next

更新并显示 goodbad 版本之间需要进行二分查找的所有版本。

备注

goodbadskip 命令执行后默认自动运行 vb bisect next 命令,可以使用下面的 vb bisect options 子命令进行设置。

log|chart

vb bisect log
vb bisect chart

显示 goodbadskip 版本的日志。vb bisect log 按测试顺序显示版本日志。vb bisect chart 按签入顺序显示版本日志。

reset

vb bisect reset

清理二分状态,取消之前的所有二分历史记录,返回到二分查找开始的状态。

options

vb bisect options [NAME] [VALUE]

列出所有二分选项,对二分法默认状态的设置。

选项

auto-next

vb bisect good|bad|skip 命令执行后自动执行 vb bisect next , 默认打开状态,可以使用命令 vb bisect auto-next off 关闭。

direct-only

当处于 on 时,只会考虑主干分支,忽略被合并分支的提交版本。

display

vb bisect next 之后运行的命令。包括:”chart”, “log”, “status”, “none”,默认显示 “chart”。

linear

进行线性扫描而不是真正的二等分,在第一个 bad 结果处停止,默认为 off

run

vb bisect run [OPTIONS] COMMAND

反复调用指定的指定命令来运行二分法。该命令的退出代码应为 0(表示 good )、125(表示 skip )和任何其他值(表示 bad )。

选项

-i|--interactive

在每个步骤之后提示用户做出 good|bad|skip 的决定,而不是使用 COMMAND 命令的退出代码

vlist|ls|status

vb bisect vlist|ls|status [-a|--all]

列出最近一次 goodbad 之间的所有提交版本。

ui

vb bisect ui

visionbyte ui 类似,在浏览器上打开项目时间轴,但是 bisect ui 从时间轴开始,仅显示当前二分图中的签入。

undo

vb bisect undo

撤消最近的一次 goodbad 或者 skip 命令。