假设我之前为遗留系统设置了一个超级流畅的测试框架。也就是说,在功能 A 测试之前,功能 A 已经存在了很久。功能 B、C 和 D 出现了,但在我们没有意识到的情况下,它们在某个时刻打破了功能 A 的测试。
我们想找出哪些功能做到了这一点。
现在我想跑步:
git bisect <bad> <good>
git run ./swish_test_suite.sh
问题是测试功能 A 的代码文件位于
<bad>
和 <good>
之间。我尝试过手动提取代码,但随后各种配置和测试数据路径中断(脆弱代码?)。
有没有办法告诉
git bisect
忽略文件夹?我可以想象有时会出现严重错误,但我猜这可能比其他选择更容易。
这里没有解决在执行 Git 二等分时如何忽略目录?因为这涵盖了构建文件夹,解决方案是将它们从存储库中删除,但是我想保持我的测试提交!
这个 git bisect 与功能分支/需要稍后提交来构建也有点不同,因为我没有使用补丁或feature分支(应该吗?)而且解决方案似乎只是手动运行它,不是
git bisect run
宁它!
对于这样的情况,请以在每个步骤中添加您需要的内容的方式编写测试脚本。
git help bisect
手册中有一个示例,您可以根据自己的需要进行调整。即,如果该示例执行 git merge hotfix
,请执行您需要的任何操作来获取所需的测试文件。根据具体情况,合并可能不是您想要的,但您可以从某个地方挑选您的测试,或者简单地将它们事先复制到其他目录(在二等分操作之前),然后使用 cp
将它们复制到
.
· Automatically bisect with temporary modifications (hot-fix):
$ cat ~/test.sh
#!/bin/sh
# tweak the working tree by merging the hot-fix branch
# and then attempt a build
if git merge --no-commit hot-fix &&
make
then
# run project specific test and report its status
~/check_test_case.sh
status=$?
else
# tell the caller this is untestable
status=125
fi
# undo the tweak to allow clean flipping to the next commit
git reset --hard
# return control
exit $status
git bisect
允许排除特定路径,因此该命令根本不会检查更改该路径的提交(除非文档不清楚它是否会跳过除了该路径之外还更改另一路径的提交)。
git bisect start -- ':/' ':!/dir1/' ':!/dir2/'
这里我使用“pathspec”首先包含存储库中的所有内容,然后排除顶级
dir1
和 dir2
。
在这种情况下,包含所有内容的第一个
':/'
是强制性的,因为这些参数确定要包含的目录(并且!
反转了逻辑),因此在没有':/'
的情况下,git会认为你没有包含任何内容根本不会,你会得到一个 No testable commit found.
错误。