我有一个很久以前引入的错误,测试它很痛苦。但是,我强烈怀疑引入错误的更改发生在一个特定的源代码文件中。
我可以在更改该文件的提交子集上运行 git bisect 吗?
我有一个很久以前引入的错误,测试它很痛苦。但是,我强烈怀疑引入错误的更改发生在一个特定的源代码文件中。
我可以在更改该文件的提交子集上运行 git bisect 吗?
是的你可以。在manpage中,您可以找到以下行:
git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]
[--no-checkout] [<bad> [<good>...]] [--] [<paths>...]
所以之后--
,你把文件或目录的路径。
例如:
git bisect start -- arch/i386 include/asm-i386
Git bisect 允许您避免测试提交(请参阅手册页中的“避免测试提交”):当您进行二分时,并且 git 选择了一个提交供您测试,您可以使用git reset --hard <commit you want>
.
使用git log
,您可以找到影响文件(或子目录)的最后一次提交 - 这将返回其哈希:
git log -1 --pretty=format:%H -- path_that_you_are_interested_in
因此,每次git bisect
建议您提交测试时,您都应该运行此命令以确保您只测试受影响的提交somepath
:
git reset --hard $(git log -1 --pretty=format:%H -- somepath)
现在,我们还需要处理一件事。somepath
如果在最后一次检查好的提交和当前选择的提交之间没有有趣的提交(即没有修改的提交) git bisect
,我们可能会陷入循环。为了避免这种情况,我们应该使用条件子句:
#!/bin/bash
last_good=$(git bisect log | tail -1 | sed 's/git bisect good //')
last_interesting=$(git log -1 --pretty=format:%H -- lily/)
if [ "$last_good" == "$last_interesting" ]; then
# there are no commits modifying somepath between previously
# tested and currently checked-out one, so it must be good
git bisect good
else
git reset --hard $(git log -1 --pretty=format:%H -- somepath)
fi
一种技术是创建一个临时分支,从一个已知的好位置开始,并简单地复制所有[即脚本]涉及该文件的提交,然后对该临时分支进行平分。这样你就可以跳过所有不相关的提交。
上个月左右的$gmane/232114在 Git 邮件列表中对此进行了讨论。讨论没有找到一种简单的方法来预先跳过没有相关更改的提交(这可能是有用的——正如他们所说,欢迎使用补丁)