如何使用git筛选器分支测试提交
我怀疑我的存储库中最后150个提交中的一些被破坏了——也就是说,如果我签出其中一个提交,代码将无法编译。我想我可以使用git filter branch来测试这一点,但我对参数感到困惑。我想到了这个: git筛选器分支-f--提交筛选器“git提交树”$@;cd./。。;制作defconfig;做‘头^ 但是我得到了这个输出:如何使用git筛选器分支测试提交,git,git-filter-branch,Git,Git Filter Branch,我怀疑我的存储库中最后150个提交中的一些被破坏了——也就是说,如果我签出其中一个提交,代码将无法编译。我想我可以使用git filter branch来测试这一点,但我对参数感到困惑。我想到了这个: git筛选器分支-f--提交筛选器“git提交树”$@;cd./。。;制作defconfig;做‘头^ 但是我得到了这个输出: $ git filter-branch -f --commit-filter 'git commit-tree "$@"; cd ../..; make defconfi
$ 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中的最后两次提交不匹配,“无法写入重写的提交”是什么意思?我显然做错了什么,但我不知道是什么。这似乎…肮脏
您所要做的就是检查提交,一次一个,编译它们,并针对它们运行测试,对吗
相反,您可以做的是检查这些提交,从1到您想要返回的数量,运行测试,并将测试结果报告到文件中
这将使您开始:
也许有一种更优雅的方式来实现这一点,但原则是:
- 你正在经历每一次提交,一次一个,处于分离的头部状态
- 您正在运行任何需要的步骤,以便及时构建分支
- 您可以运行测试(并记录它们;我将此作为练习留给读者)
- 然后恢复分支的状态,使其指向原始头部
COUNT=0
while [ $COUNT -lt 150 ];
do
git checkout HEAD~1;
make defconfig && make;
let $COUNT=$COUNT + 1;
done
git checkout master;
这不是设计git filter branch的目的 过滤器分支的作用(尽可能简单地描述)是:
- 对于某些提交集(基于参数),请在签出每个提交、应用筛选器并签入结果后复制这些提交
- 对于某些分支名称集(以及可选的标记名称),在过滤提交后,使新分支(以及可选的标记)名称指向新复制的分支
1筛选过程中的签出和重新签入部分往往最慢,因此每当筛选分支可以避免执行“真正的”签出和签入操作时,它都会这样做。这就是为什么有一个
--索引过滤器
,以及--提交过滤器
实际上没有提取任何树的原因。(树过滤器强制执行完全签出,但如果编译过程是只读的,则可能会对您的情况造成不良影响。)谢谢。我要试一试。我仍然想知道如何使用git filter branch做我想做的事情。我很难理解这个功能是如何工作的。@RichardFallon:filter branch不适合您要做的事情。通常,您将使用它来重写大量历史记录,而不是对某些数量的提交运行诊断。
COUNT=0
while [ $COUNT -lt 150 ];
do
git checkout HEAD~1;
make defconfig && make;
let $COUNT=$COUNT + 1;
done
git checkout master;