如何将git bisect run与检测脚本合并到单个Shell脚本中?
单脚本实现Git Bisect自动二分查找
核心思路
让脚本同时承担bisect流程初始化和提交状态判断两个职责,通过特殊参数区分两种运行模式:
- 直接执行脚本时:初始化git bisect流程,调用
git bisect run指向自身并传入判断模式标记 - 收到判断模式标记时:执行提交检查逻辑,返回符合git bisect规则的退出码
完整脚本示例(bisecter.sh)
#!/bin/bash # 判断是否处于bisect检查模式 if [ "$1" = "--bisect-check" ]; then TARGET_CONTENT="$2" # 这里写你的检查逻辑,比如查找当前提交是否包含目标内容 if grep -q "$TARGET_CONTENT" ./target-file.txt; then # 找到目标内容,标记为bad(因为我们要找引入该内容的提交) exit 1 else # 未找到,标记为good exit 0 fi # 可选:如果遇到无法检查的情况,返回125跳过该提交 # exit 125 else # 初始化bisect流程 TARGET_CONTENT="$1" if [ -z "$TARGET_CONTENT" ]; then echo "用法: $0 <要查找的内容>" exit 1 fi # 请根据实际情况替换good和bad的提交哈希/标签 echo "初始化git bisect..." git bisect start git bisect good v1.0 # 已知没问题的提交 git bisect bad HEAD # 已知有问题的提交 # 调用git bisect run,指向当前脚本并传入检查模式标记和目标内容 git bisect run "$0" --bisect-check "$TARGET_CONTENT" # 二分结束后清理bisect状态 git bisect reset fi
关键细节说明
- 模式区分:用
--bisect-check作为标记,让脚本知道自己是被git bisect调用还是直接执行 - 脚本自引用:
git bisect run "$0"确保调用的是当前脚本,无需额外的外部判断脚本 - 退出码规则:严格遵循git bisect要求:
exit 0:当前提交正常(good)exit 1:当前提交有问题(bad)exit 125:跳过该提交(比如编译失败时)
- 参数传递:把要查找的内容(比如示例中的102)通过参数传递给检查逻辑部分
使用方法
- 给脚本添加执行权限:
chmod +x bisecter.sh - 运行脚本并传入目标内容:
./bisecter.sh 102
内容的提问来源于stack exchange,提问作者Try_hard
相关产品推荐
相关产品推荐

