因此,Git 的 C 命令会找到正确的顶级工作树,而 shell 脚本却找不到。
嗯,随着 Git 2.21(2019 年 2 月),git bisect 继续从 shell 脚本过渡到 C。
请参阅commit 06f5608、commit 450ebb7、commit 129a6cf、commit 4fbdbd5、commit e3b1e3b、commit 0f30233、commit 5e82c3d(2019 年 1 月 2 日)Pranit Bauva (pranitbauva1997)。
帮助者:Ramsay Jones (jeffhostetler) 和 Stephan Beyer (sbeyer)。
(由 Junio C Hamano -- gitster -- 在 commit 09a9c1f 中合并,2019 年 2 月 7 日)
bisect--helper: bisect_start shell 函数部分在 C 中
在 C 中部分地重新实现 bisect_start shell 函数并添加
bisect-start 子命令到 git bisect--helper 来调用它
git-bisect.sh .
这还没有完成,但迁移的副作用是能够从子文件夹执行git bisect。
Git 2.23 进一步改进了向 C 的转换。
请参阅 Johannes Schindelin (dscho) 的 commit 7877ac3(2019 年 5 月 21 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 5b476dc,2019 年 6 月 17 日)
使用 Git 2.25(2020 年第一季度),bisect_reset 受益于修复。
见Tanushree Tumane (tanushree27)commit 51a0a4e(2019 年 12 月 9 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 4bfc9cc,2019 年 12 月 25 日)
指导人:Johannes Schindelin
指导人:Christian Couder
签字人:Tanushree Tumane
签字人:Miriam Rubio
在5e82c3dd22a(“bisect--helper:bisect_resetC 中的 shell 函数”,2019-01-02,Git v2.21.0-rc0 -- merge)中,[git bisect](https://git-scm.com/docs/git-bisect) reset子命令已移植到 C。
当调用git checkout 失败时,向用户报告错误消息(could not check out original HEAD)。
但是,此错误消息使用了刚刚发布的strbuf。
让我们切换一下:先使用它,然后释放它。
从 Git 2.26(2020 年第一季度)开始,“git bisect--helper”的底层机制被重构为更易于重用的部分。
参见commit 6c69f22、commit 9ec598e、commit 45b6370、commit cdd4dc2、commit e8e3ce6、commit ce58b5d、commit 7613ec5(2020 年 2 月 17 日)Pranit Bauva (pranitbauva1997)。
请参阅commit 680e8a0、commit b8e3b2f、commit 16538bf(2020 年 2 月 17 日)Miriam Rubio (``)。
参见commit bfacfce、commit 292731c(2020 年 2 月 17 日)Tanushree Tumane (tanushree27)。
(由 Junio C Hamano -- gitster -- 合并于 commit 25063e2,2020 年 3 月 5 日)
例如:
指导人:Christian Couder
签字人:Tanushree Tumane
签字人:Miriam Rubio支持>
让我们将代码从 bisect_next_check() 重构为一个新的 decide_next() 辅助函数。
这删除了一些goto 语句,使代码更简单、更清晰、更易于理解。
在 Git 2.28(2020 年第三季度)之前,解析“git bisect start”命令行的代码在验证参数时很松懈。
参见Carlo Marcelo Arenas Belón (carenas) 的commit 4d9005f(2020 年 5 月 20 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 63e50b8,2020 年 6 月 9 日)
bisect--helper:避免在start --term-* 中出现语法错误的段错误
签字人:Carlo Marcelo Arenas Belón
签字人:Christian Couder
06f5608c14 ("bisect--helper: bisect_start shell function partial in C", 2019-01-02, Git v2.21.0-rc0 -- merge) 为[git bisect 添加了一个松散的解析器start](https://git-scm.com/docs/git-bisect) 这可能会在错误的语法调用下导致以自定义术语开头的段错误。
检测命令行中是否有足够的参数可用于--term-{old,good,new,bad},如果没有,则以原始实现将显示的相同语法错误中止。
在 Git 2.29(2020 年第四季度)之前,“git bisect start X Y(man),当 X 和 Y 不是有效的提交对象名称时,应该将 X 和 Y 作为路径规范,但没有t.
参见Christian Couder (chriscool) 的commit 73c6de0(2020 年 9 月 25 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 03a0182,2020 年 10 月 4 日)
bisect: 启动时不要使用无效的oid作为rev
签字人:Christian Couder
签字人:Johannes Schindelin
在06f5608c14 ("bisect--helper: bisect_start shell function partial in C", 2019-01-02, Git v2.21.0-rc0 -- merge) 中,我们更改了以下 shell 代码:
- rev=$(git rev-parse -q --verify "$arg^{commit}") || {
- test $has_double_dash -eq 1 &&
- die "$(eval_gettext "'\$arg' does not appear to be a valid revision")"
- break
- }
- revs="$revs $rev"
进入:
+ char *commit_id = xstrfmt("%s^{commit}", arg);
+ if (get_oid(commit_id, &oid) && has_double_dash)
+ die(_("'%s' does not appear to be a valid "
+ "revision"), arg);
+
+ string_list_append(&revs, oid_to_hex(&oid));
+ free(commit_id);
如果"has_double_dash" 为假时“arg”无效,旧代码将“中断”出参数循环。
不过,在新的 C 代码中,oid_to_hex(&oid) 被无条件地附加到“revs”。这首先是错误的,因为“oid”是垃圾,因为 get_oid(commit_id, &oid) 失败,其次是因为它没有跳出参数循环。
不跳出参数循环意味着“arg”不被视为路径限制(这是错误的)。
在 Git 2.29(2020 年第四季度)中,继续用 C 重写“git bisect”(man) 脚本。
见commit 517ecb3、commit 09535f0(2020 年 9 月 24 日)Pranit Bauva (pranitbauva1997)。
请参阅commit c7a7f48(2020 年 9 月 24 日)和 commit 7b4de74、commit 3027676、commit ef5aef5(2020 年 8 月 28 日)Miriam Rubio (mirucam)。
(由 Junio C Hamano -- gitster -- 合并到 commit f4cc68c, 04 2020 年 10 月)
bisect--helper:在 C 中重新实现 bisect_next 和 bisect_auto_next shell 函数
指导者:Lars Schneider
指导者:Christian Couder
指导者:Johannes Schindelin
签字人:Pranit Bauva
签字人:Tanushree Tumane
签字人:Miriam Rubio支持>
在 C 中重新实现 bisect_next() 和 bisect_auto_next() shell 函数,并将子命令添加到 [git](https://github.com/git/git/blob/517ecb3161daa4503f7638489fd44177b3659913/Documentation/git-.txt)<sup>([man](https://git-scm.com/docs/git-))</sup> bisect--helper 以从 git-bisect.sh 调用它们。
bisect_auto_next() 函数返回一个枚举 bisect_error 类型作为整体 [git bisect](https://github.com/git/git/blob/517ecb3161daa4503f7638489fd44177b3659913/Documentation/git-bisect.txt)<sup>([man](https://git-scm.com/docs/git-bisect))</sup> 可以在 bisect_next() 退出时返回错误代码。
bisect_next() 失败时返回错误,修复 shell 脚本版本的错误。
使用--bisect-next 和--bisect-auto-next 子命令是将shell 函数移植到C 以使用现有测试套件的临时措施。随着更多功能的移植,--bisect-auto-next 子命令将被淘汰,将被其他一些方法调用。
在 Git 2.30(2021 年第一季度)中,继续用 C 重写“git bisect”(man)。
参见commit b0f6494、commit 5c517fe、commit 9b437b0、commit 27257bc、commit 04774b4、commit e439607、commit 88ad372(2020 年 10 月 15 日)Pranit Bauva (pranitbauva1997)。
(合并Junio C Hamano -- gitster --commit cfdc70b,2020 年 11 月 9 日)
bisect--helper:在 C 中重新实现 bisect_state & bisect_head shell 函数
指导者:Lars Schneider
指导者:Christian Couder
指导者:Johannes Schindelin
签字人:Pranit Bauva
签字人:Tanushree Tumane
签字人:Miriam Rubio sup>
审核人:Johannes Schindelin
在 C 中重新实现 bisect_state() shell 函数,并将子命令 --bisect-state 添加到 git-bisect--helper 以从 git-bisect.sh 调用它们。
使用 Git 2.31(2021 年第一季度):继续用 C 语言重写“git bisect”(man)。
参见commit 97b8294、commit e4c7b33、commit 9feea34、commit b7a6f16、commit 68efed8、commit 2b1fd94、commit 97d5ba6(2021 年 2 月 3 日)Pranit Bauva (pranitbauva1997)。
(合并Junio C Hamano -- gitster --commit 0871fb9,2021 年 2 月 17 日)
指导者:Lars Schneider
指导者:Christian Couder
指导者:Johannes Schindelin
签字人:Pranit Bauva
签字人:Tanushree Tumane
签字人:Miriam Rubio支持>
git-bisect.sh shell 脚本中不再使用--bisect-write 子命令。
而是直接从 C 实现中调用函数 bisect_write()。
"git bisect"(man) 在 2.30 的时间范围内用 C 重新实现了更多,并没有将带注释的标签作为好/坏的端点。
此回归已在 Git 2.31.1(2021 年第一季度)中得到纠正。
参见Jeff King (peff) 的commit 7730f85(2021 年 3 月 16 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 35381b1,2021 年 3 月 19 日)
签字人:杰夫·金
此补丁修复了一个错误,即 'git-bisect'(man) 无法将带注释的标签接收为“git bisect”好<tag> 等。
这是27257bc 中的回归(“bisect--helper:在 C 中重新实现 bisect_state & bisect_head shell 函数”,2020-10-15,Git v2.30.0-rc0 -- merge 在 batch #4 中列出) .
原来的shell代码叫:
sha=$(git rev-parse --verify "$rev^{commit}") ||
die "$(eval_gettext "Bad rev input: \$rev")"
这会将输入剥离到提交(如果不可能,则抱怨)。
但是 C 代码只是调用了get_oid(),这将产生标签的 oid。
解决方法是剥离到提交。
这里的错误信息对于 Git 来说有点不习惯(因为它以大写字母开头)。
新的错误信息:
Bad rev input (not a commit): xxxx
警告:“git bisect skip”(man) 当自定义词用于新/旧时 not 在 Git 2.31 中是否有效,已通过以下方式更正Git 2.32(2021 年第二季度)。
参见 Ramsay Jones (ramsay-jones) 的 commit 4cd66e7(2021 年 4 月 29 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 8ca4771,2021 年 5 月 11 日)
bisect--helper:在“bisect skip”命令中使用BISECT_TERMS
报告人:Trygve Aaberge
签字人:Bagas Sanjaya
签字人:Ramsay Jones支持>
Commit e4c7b33 ("bisect--helper: reimplement bisect_skip shell function in C", 2021-02-03, Git v2.31.0-rc0 -- merge 在batch #9 中列出),作为shell 到 C 的转换,在新的“bisect skip”命令执行期间忘记读取“条款”文件 (.git/BISECT_TERMS)。
因此,“bisect skip”命令将使用默认的“坏”/“好”术语。
如果二等分项已设置为非默认值(例如通过“bisect start”命令),则“bisect skip”命令将失败。
为了纠正这个问题,我们在“bisect--helper”的“--bisect-skip”命令实现中插入了对get_terms() 函数的调用,该函数从该文件中读取非默认条款(如果已设置) '。
另外,添加test 以防止未来可能出现的回归。
在 Git 2.33(2021 年第三季度)中,“git bisect”(man) 催生了 git show-branch(man) 只是为了漂亮地打印签出要测试的下一个版本后提交的标题;这已用 C 重写。
参见commit 1fcc40c(2021 年 7 月 28 日)和 commit ffcb4e9(2021 年 7 月 27 日)Junio C Hamano (gitster)。
(由 Junio C Hamano -- gitster -- 合并于 commit ae2d05d,2021 年 8 月 24 日)支持>
bisect: 不要仅仅为了显示当前提交而运行 show-branch
在“git bisect”(man) 的脚本版本中,我们使用“git show-branch”(man) 来描述单个提交bisect 日志,并在签出下一个要测试的版本后发送给交互式用户。
当写入平分日志条目的辅助函数在0f30233 处重写时,“git show-branch”的先前用法丢失了(“bisect--helper:bisect_write C 中的 shell 函数”,2019-01-02, Git v2.21.0-rc0 -- merge) 在 C 中
但是从0871984 (bisect: make , 2009-05-09, Git v1.6.4-rc0 -- merge) (bisect: make "git bisect" 使用新的--next-all bisect-helper 函数,2009-05-09) 开始使用在ef24c7c (bisect--helper: add , 2009-04-19, Git v1.6.4-rc0 -- @987654461 引入的忠实 C-rewrite @) (bisect--helper: 添加“--next-exit”输出二分结果,2009-04-19)。
使用我们的助手 pretty.c::format_commit_message() 显示“[<full hex>] <subject>”非常简单,而生成 show-branch 则有点过头了。
让我们失去一个外部进程。