我怀疑我的存储库中的最后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中的最后两个提交不匹配,“无法写入重写提交”是什么意思?我显然做了一些完全错误的事,但我不知道是什么。
答案 0 :(得分:1)
这似乎...... 脏 。
您要做的只是检查提交,一次检查一次,编译它们,然后针对它们运行测试,对吗?
你可以做的是检查那些提交,从1开始到你想要返回的许多提交,运行测试,并将测试结果报告给文件。
这将让你启动:
for i in $(seq 1 150);
do
git checkout HEAD~$i;
make defconfig && make;
git checkout master;
done
可能有一种更优雅的方式,但原则是:
稍微更优雅的方法是仅在完成后将分支移回:
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
强制进行全面检查,但除非您的编译过程是只读的,否则它可能会对您的情况造成严重影响。)