# git-bisect
**Repository Path**: ijinma/git-bisect
## Basic Information
- **Project Name**: git-bisect
- **Description**: No description available
- **Primary Language**: Python
- **License**: AGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-24
- **Last Updated**: 2025-09-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Git Bisect 自动化工具
这是一个用于自动化执行 Git Bisect 的 Python 工具,可以帮助您快速定位代码库中引入问题的具体提交。
## 功能特点
1. **自动化 Bisect 流程**:自动执行 git bisect 的完整流程,无需手动操作
2. **模块化设计**:构建和检查脚本完全独立,用户可自定义
3. **参数传递**:自动将当前提交哈希传递给构建和检查脚本
4. **详细日志**:实时记录每次提交的测试结果
5. **灵活配置**:支持通过命令行参数指定配置文件
6. **增强的命令执行**:使用增强的命令执行函数,支持更灵活的输出重定向
## 使用方法
### 1. 创建配置文件
首先创建一个 `config.json` 配置文件:
```json
{
"repo": "/path/to/your/repo",
"start": "good_commit_hash",
"end": "bad_commit_hash",
"build_script": "build_script.sh",
"check_script": "check_script.sh",
"log_dir": ".",
"result_md": "result.md"
}
```
配置项说明:
- `repo`:代码仓库路径
- `start`:已知的"好"提交哈希
- `end`:已知的"坏"提交哈希
- `build_script`:构建脚本文件名
- `check_script`:检查脚本文件名
- `log_dir`:日志文件存储目录
- `result_md`:(可选)结果文件路径,如果不指定则会生成带时间戳的文件
### 2. 创建构建脚本
创建 `build_script.sh` 文件:
```bash
#!/bin/bash
COMMIT_SHORT=$1 # 获取当前提交的前11位哈希
echo "Building commit: $COMMIT_SHORT"
# 在这里添加您的构建逻辑
# 构建成功返回0,失败返回非0值
exit 0
```
### 3. 创建检查脚本
创建 `check_script.sh` 文件:
```bash
#!/bin/bash
COMMIT_SHORT=$1 # 获取当前提交的前11位哈希
echo "Checking commit: $COMMIT_SHORT"
# 在这里添加您的检查逻辑
# 检查通过返回0,失败返回非0值
exit 0
```
### 4. 运行工具
```bash
# 使用默认配置文件
python3 git_bisect.py
# 指定配置文件
python3 git_bisect.py -c/--config /path/to/your/config.json
```
## 工作原理
```mermaid
flowchart TD
A[开始: 运行 git_bisect.py] --> B[读取配置文件]
B --> C[进入代码仓库目录]
C --> D[执行 git bisect start]
D --> E[标记起始提交为 good]
E --> F[标记结束提交为 bad]
F --> G[执行 git bisect run]
G --> H[Git 选择中间提交进行测试]
H --> I[调用 Python 脚本测试模式]
I --> J[获取当前提交哈希]
J --> K[执行 build_script.sh 并传参]
K --> L{构建成功?}
L -->|否| M[返回退出码 1
标记为 bad 提交]
L -->|是| N[执行 check_script.sh 并传参]
N --> O{检查通过?}
O -->|是| P[返回退出码 0
标记为 good 提交]
O -->|否| Q[返回退出码 1
标记为 bad 提交]
P --> R[记录测试结果到日志]
Q --> R
M --> R
R --> S{还有提交需要测试?}
S -->|是| H
S -->|否| T[找到第一个 bad 提交]
T --> U[结束 bisect 过程]
U --> V[输出结果]
```
## 日志记录
工具会在 `log_dir` 目录中生成结果文件,记录每次提交的测试结果:
- 如果配置了 `result_md` 参数,则会使用指定的文件名
- 如果未配置 `result_md` 参数,则会生成带时间戳的 `YYYYMMDDHHMMSS_commit_results.md` 文件
结果文件格式如下:
| Commit | Build | Check | Status |
|--------|-------|-------|--------|
| abc123 | 1 | 1 | good |
| def456 | 1 | 0 | bad |
- Commit:提交哈希
- Build:构建结果(1=成功,0=失败)
- Check:检查结果(1=通过,0=失败)
- Status:提交状态(good=好提交,bad=坏提交)
每次运行脚本时,如果指定了 `result_md` 参数且文件已存在,会自动删除旧文件。
## 注意事项
1. 确保构建脚本和检查脚本具有可执行权限
2. 构建脚本和检查脚本应处理所有可能的错误情况
3. 工具会自动将当前提交的前11位哈希作为参数传递给脚本
4. 脚本中可通过 `$1` 获取提交哈希参数
5. 如果配置了 `result_md` 参数,每次运行会删除已存在的结果文件
6. 如果未配置 `result_md` 参数,结果文件名包含时间戳,防止多次运行时文件被覆盖