如何获取git bisect的当前“状态”?

11

我正在对 oh-my-git 做一些个人修改(在终端上显示 git 状态),我想要显示当前 bisect 的“状态”。具体来说,我想获得剩余提交次数和最后一次 bisect 命令的步骤近似数量,例如:

Bisecting: 9 revisions left to test after this (roughly 3 steps)

似乎唯一获取此信息的方法是通过实际执行 git bisect goodgit bisect bad。然而,我不想运行这两个命令来更改存储库的状态 - 我只想获取当前的 bisect 状态。


包含此功能的 oh-my-git 分支(供有兴趣者使用):https://github.com/compholio/oh-my-git - Compholio
注意:随着 Git 2.34(2021年第四季度)的发布,"git bisect"(man) 的 C 重写正在继续,并涉及 git bisect visualize。(由 Junio C Hamano -- gitster --commit 0a4cb1f 中合并,于2021年9月23日) - VonC
@VonC,您能否检查一下这是否会影响当前的答案? - Compholio
我会在2.34发布后进行测试,看看这个新实现是否改变了状态。 - VonC
1个回答

14

基于极其有限的测试,以下是相当天真的答案:

可以使用 git bisect visualize 命令获取要探查的提交范围,并且可以使用 git bisect visualize | wc -l 或其他方式来粗略地计算此范围。

进入这种状态之前打印的消息似乎大致基于该范围的一半,并且取该半数的以 2 为底的对数。

例如,我现在处于一种状态,我的提示信息是这样的:

Bisecting: 10 revisions left to test after this (roughly 3 steps)

在这种状态下,我有:

$ git bisect visualize --oneline | wc -l
21

也就是说,“10个修订版本”实际上意味着在怀疑的范围内有21个提交。我们处于该范围的中间,因此大约有10个提交位于任一方向上。为了得到这10个提交,我们计算21/2,向下取整。要得到“还剩大约3个需要测试的提交”,我们只需对10取以2为底的对数,向下取整。

以我最喜欢的脚本语言(替换为你自己的):

$ txr -P '(let* ((count (length
                          (get-lines
                            (open-command "git bisect visualize --oneline"))))
                 (left (trunc count 2)))
            `Bisecting: @left revisions left to test after this \
            \ (roughly @(int-flo (log2 left)) steps)`)'
Bisecting: 10 revisions left to test after this (roughly 3 steps)

由于bisect命令会在您没有报告至少一个好的和一个坏的提交时发出警告,因此需要一些错误处理。还有一些特殊情况,比如避免将log2应用于零(如果可能发生这种情况)。


1
太好了,我不知道你可以在那个命令中使用 --oneline。我看了一下手册,“git bisect view --stat” 似乎是我能解析的最接近的东西,但我有点担心用 '^commit' 进行 grep,因为可能会出现多行消息。 - Compholio
1
我直觉地添加了“--oneline”,因为它的输出看起来像“git log”的输出,我想它只是基于“git log”而不是重新实现,并且可能会通过选项传递。 - Kaz
1
由于我的操作系统上没有txr软件包,因此以下是使用Perl编写的代码:git bisect visualize --oneline|wc -l|perl -MPOSIX -lne 'print "正在二分查找:还有".floor(($_-1)/2)."个修订版本需要测试(大约需要".(floor(log($_-1)/log(2))-1)."步)" if $_' - Jan Kratochvil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接