3

您可以将路径列表传递给,git bisect以便仅测试更改这些文件的提交:

如果您知道要跟踪的问题涉及树的哪一部分,则可以通过在发出 bisect start 命令时指定路径参数来进一步减少试验次数:

$ git bisect start -- arch/i386 include/asm-i386

但是,我想做双重的:忽略只触及某些文件的提交,所以像

$ git bisect start --unrelated arch/i386 include/asm-i386

会跳过一个涉及到的提交,arch/i386/foo.cinclude/asm-i386/utils.s会包含一个涉及到arch/i386/bar.c和的提交arch/amd64/baz.c(因为后者不在列出的路径下,因此整个提交是相关的)。

有没有办法做到这一点?

4

2 回答 2

3

做你想做的事情的方法是使用bisect run <script>.
像到目前为止一样使用 bisect 并将 bisect 与 script 选项一起使用。

该脚本将返回适当的跳过代码(或 125 表示不可测试 - 更适合您的情况)。

请注意,如果当前源代码良好,则脚本(上例中的 my_script)应以代码 0 退出,如果当前源代码不良,则以 1 到 127(含)之间的代码退出,但 125 除外。

任何其他退出代码都将中止 bisect 过程。应该注意的是,通过“exit(-1)”终止的程序会留下 $? = 255,(参见 exit(3) 手册页),因为该值被“& 0377”截断。

当无法测试当前源代码时,应使用特殊退出代码 125。如果脚本使用此代码退出,则将跳过当前版本(请参阅上面的 git bisect skip)。125 被选为用于此目的的最高合理值,因为 POSIX shell 使用 126 和 127 来表示特定的错误状态(127 表示未找到命令,126 表示已找到命令但不可执行——这些细节确实没关系,因为它们是脚本中的正常错误,就“平分运行”而言)。

于 2015-06-29T09:56:58.243 回答
1

正如 codeWizar 所说,您可能应该为此方法使用脚本

写:

git bisect start HEAD commit-id

有一个script.sh这样的:

[ "$(git diff-tree --no-commit-id --name-only -r HEAD | sort)" = "path"  ] && exit 125
make && exit 0 || exit 1

并运行

git bisect run script.sh

该行:

[ "$(git diff-tree --no-commit-id --name-only -r HEAD | sort)" = "path"  ] && exit 125

将测试当前提交是否包含确切的文件更改路径,如果是这种情况,将退出 125(例如,跳过该提交进行二等分)

您还可以使用\n内部路径指定多个路径

于 2015-06-29T10:02:27.673 回答