如何使用git-filter-branch来测试提交

时间:2015-09-30 22:42:49

标签: git git-filter-branch

我怀疑我的存储库中的最后150次提交中的某些提交被破坏了 - 也就是说,如果我签出其中一个提交,代码将无法编译。我想我可以使用git-filter-branch来测试这个,但我对参数感到困惑。我想出了这个:

git filter-branch -f --commit-filter'git commit-tree“$ @”; cd ../ ..; make defconfig;制作'HEAD ^ ..

但是我得到了这个输出:

$ git filter-branch -f --commit-filter 'git commit-tree "$@"; cd ../..; make defconfig; make' HEAD^..
Rewrite 4c3b2950f53717ba22280a76c211c9eab3135348 (1/1)arch/arm64/kernel/setup.c: In function 'arm64_spcr_setup':
arch/arm64/kernel/setup.c:615:3: error: implicit declaration of function 'acpi_setup_spcr' [-Werror=implicit-function-declaration]
   acpi_setup_spcr();
   ^
cc1: some warnings being treated as errors
make[1]: *** [arch/arm64/kernel/setup.o] Error 1
make: *** [arch/arm64/kernel] Error 2
could not write rewritten commit

这对我没有意义。编译错误与我的repo中的最后两个提交不匹配,“无法写入重写提交”是什么意思?我显然做了一些完全错误的事,但我不知道是什么。

2 个答案:

答案 0 :(得分:1)

这似乎......

您要做的只是检查提交,一次检查一次,编译它们,然后针对它们运行测试,对吗?

你可以做的是检查那些提交,从1开始到你想要返回的许多提交,运行测试,并将测试结果报告给文件。

这将让你启动

for i in $(seq 1 150);
do
    git checkout HEAD~$i;
    make defconfig && make;
    git checkout master;
done

可能有一种更优雅的方式,但原则是:

  • 您正在进行每次提交,一次一个处于独立的HEAD状态。
  • 您正在运行所需的任何步骤,以便及时构建分支
  • 你进行测试(并记录下来;我将这作为练习留给读者)。
  • 然后恢复分支的状态,使其指向其原始HEAD。

稍微更优雅的方法是仅在完成后将分支移回:

COUNT=0
while [ $COUNT -lt 150 ];
do
    git checkout HEAD~1;
    make defconfig && make;
    let $COUNT=$COUNT + 1;
done
git checkout master;

答案 1 :(得分:1)

这不是git filter-branch的目的。

尽可能简单地描述了什么过滤器分支:

  • 对于某些提交集(基于参数),在签出每个提交,应用过滤器并检入结果后,对这些提交进行复制
  • 对于某些分支名称集合(以及可选的标记名称),使新分支(以及可选的标记)名称指向新的复制后过滤提交。

你可以(正如你所想的那样)在“过滤”阶段检出每个提交,但因为filter-branch不是为此而设计的,而是优化为避免< / em>实际上尽可能地检查提交, 1 它比你想象的要难得多。

简而言之,filter-branch是wrong tool

(通常这里的正确工具是git bisect,它会在提交之间来回寻找引入某些错误的点,而不是通过每个提交线性地查看哪些是好的。但是,我并不完全清楚你的意图是什么,所以也许它不适合你的情况。)

1 过滤过程中的签出和重新签入部分往往是最慢的,所以每当过滤分支都可以避免做出“真正的”外出,它确实。这就是为什么--index-filter,以及为什么--commit-filter实际上不提取任何树的原因。 (--tree-filter强制进行全面检查,但除非您的编译过程是只读的,否则它可能会对您的情况造成严重影响。)