git bisect 如何使用
详细信息查看git bisect帮助文档
$git bisect --help
举个小例子
怎么找出 第一个导致lit用例vector-compare-all_of.ll失败的提交
$git branch
* main
我故意在HEAD~1处("bug zx1")写了个bug让某lit用例运行失败
$git log -n 5
commit a34a23e0c8dff5ed943dfecba350f373503e8984 (HEAD) "zx2"
commit 4b6afdd2b31d6208237b9b2741929cc91cddcb4a "bug zx1"
commit 45fd93fdffd5e85e8d3b62099cc0ecb0053b3f40 "zx0"
commit 7ad728b4b7b9f740fc701c09e0c50afde258f357 "zx-1"
commit e3cd8fedcac31a037a38889abace9e0d0205c451 "zx-2"
开始bisect,HEAD("zx2")为bad提交,HEAD~4("zx-2")为好的提交
$git bisect start HEAD HEAD~4
Bisecting: 1 revision left to test after this (roughly 1 step)
[45fd93fdffd5e85e8d3b62099cc0ecb0053b3f40] "zx0" <- 此时将中间提交设为新HEAD
$git log -n 1
commit 45fd93fdffd5e85e8d3b62099cc0ecb0053b3f40 (HEAD) "zx0"
我们可以看到git bisect会切换到一个专门的branch上
$git branch
* (no branch, bisect started on git-bisect)
main
执行run找出第一个开始使得 test 出错的提交
$git bisect run ../test_gb.sh
running ../test_gb.sh
Testing (LIT)... Passed
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[4b6afdd2b31d6208237b9b2741929cc91cddcb4a] bug zx1
Testing (LIT)... Failed (code 1)
4b6afdd2b31d6208237b9b2741929cc91cddcb4a is the first bad commit
commit 4b6afdd2b31d6208237b9b2741929cc91cddcb4a "bug zx1"
bisect run success
$git bisect reset
Previous HEAD position was 4b6afdd2b31d bug zx1
Switched to branch 'main'
执行完以后我们用reset回到原来的分支
我写的一个git bisect run …/test_gb.sh的测试脚本
$cat ../test_gb.sh
#!/bin/bash
#llvm-lit llvm/test/CodeGen/X86/vector-compare-all_of.ll
OLD_DIR=$( pwd )
LLVM_DIR="/export/users2/xiangzh1/LLVM/ORG/llvm-project"
LLVM_BUILD_DIR="$LLVM_DIR/../build-all"
LOGFILE="$LLVM_DIR/../gb.log"
LLVM_LIT="$LLVM_DIR/../build-all/bin/llvm-lit"
LIT_TEST_FILE="$LLVM_DIR/llvm/test/CodeGen/X86/vector-compare-all_of.ll"
function do_lit_test() {
if [[ "$LIT_TEST_FILE" == "" ]]; then
return 0
fi
printf "Testing (LIT)..." | tee -a "$LOGFILE"
if [[ ! -f "$LIT_TEST_FILE" ]]; then
printf " Passed (test not found).\n" | tee -a "$LOGFILE"
return 0
fi
$LLVM_LIT -vv "$LIT_TEST_FILE" >> "$LOGFILE" 2>&1
local TEST_STATUS=$?
if [[ $TEST_STATUS != 0 ]]; then
printf " Failed (code $TEST_STATUS)\n" | tee -a "$LOGFILE"
return 2
fi
printf " Passed\n" | tee -a "$LOGFILE"
return 0
}
cd $LLVM_BUILD_DIR
make -j20 &> ttdb; tail -n 20 ttdb
do_lit_test