Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用git筛选器分支测试提交_Git_Git Filter Branch - Fatal编程技术网

如何使用git筛选器分支测试提交

如何使用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

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

git筛选器分支-f--提交筛选器“git提交树”$@;cd./。。;制作defconfig;做‘头^

但是我得到了这个输出:

$ 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这比您想象的要困难得多

简而言之,过滤器分支是最重要的

(通常这里正确的工具是,它在提交之间来回跳转,寻找引入某个bug的点,而不是线性地遍历每个提交以查看哪些是好的。不过,我并不完全清楚您的意图是什么,因此它可能不是适合您的情况的工具。)



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;