如何制作git rev-list --bisect跳过特定提交?

时间:2012-03-29 19:54:35

标签: git

我正在编写一个执行二进制搜索的脚本,以便为损坏的测试分配责任。我正在使用git rev-list --bisect

我想排除构建被破坏的特定提交。 git bisect可以使用git bisect skip BROKENCOMMIT选项执行此操作。但是,我找不到使用git rev-list --bisect做同样事情的等效方法。有吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

不幸的是,没有办法告诉git rev-list --bisect跳过某些提交。

git bisect通过创建名为refs/bisect/skip-*的引用来实现跳过。好的和坏的提交存储在refs/bisect/badrefs/bisect/good-*中。 git rev-list --bisect命令会查看refs/bisect/badrefs/bisect/good-*,但出于某种神秘的原因,不会关注refs/bisect/skip-*。对于Git邮件列表来说,这似乎是一个很好的建议。

您可以使用rev-list --bisect而不是git bisect start --no-checkout,使用git bisect skip添加要跳过的提交,然后使用BISECT_HEAD引用。这种方法的一个缺点是git bisect不允许您指定引用名称空间,因此如果存在正在进行的二等分,您将覆盖它。

答案 1 :(得分:0)

作为git rev-list --bisect not 跳过 any 提交的副作用,gitCommitByP4Change(来自{{3}中的git p4 })可以进入无限循环。

请参见git-p4.pycommit d15068acommit 607a3becommit a2bee10commit d604520commit ff8c50ecommit f2768cb,{{3} }(2019年4月1日)作者:commit b30efb1
(由commit 2dda741Mazo, Andrey (``)中合并,2019年7月9日)

  

git-p4:检测/阻止gitCommitByP4Change()中的无限循环

     

在某些情况下,gitCommitByP4Change()可以进入无限循环,导致git p4 sync永远挂起。

     

问题在于git rev-list --bisect <latest> ^<earliest>可以返回<latest>,这将导致重新检查<latest>并可能导致无限循环。

     

仅导入P4存储库的一个子集和/或使用显式“ --changesfile”选项时,可能会发生这种情况。

     

一个真实的例子:

looking in ref refs/remotes/p4/mybranch for change 26894 using bisect...
Reading pipe: git rev-parse refs/remotes/p4/mybranch
trying: earliest  latest 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git rev-list --bisect 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git cat-file commit 147f5d3292af2e1cc4a56a7b96db845144c68486
current change 25339
trying: earliest ^147f5d3292af2e1cc4a56a7b96db845144c68486 latest 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git rev-list --bisect 4daff81c520a82678e1ef347f2b5e97258101ae1 ^147f5d3292af2e1cc4a56a7b96db845144c68486
Reading pipe: git cat-file commit 51db83df9d588010d0bd995641c85aa0408a5bb9
current change 25420
trying: earliest ^51db83df9d588010d0bd995641c85aa0408a5bb9 latest 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git rev-list --bisect 4daff81c520a82678e1ef347f2b5e97258101ae1 ^51db83df9d588010d0bd995641c85aa0408a5bb9
Reading pipe: git cat-file commit e8f83909ceb570f5a7e48c2853f3c5d8207cea52
current change 25448
trying: earliest ^e8f83909ceb570f5a7e48c2853f3c5d8207cea52 latest 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git rev-list --bisect 4daff81c520a82678e1ef347f2b5e97258101ae1 ^e8f83909ceb570f5a7e48c2853f3c5d8207cea52
Reading pipe: git cat-file commit 09a48eb7acd594dce52e06681be9c366e1844d66
current change 25521
trying: earliest ^09a48eb7acd594dce52e06681be9c366e1844d66 latest 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git rev-list --bisect 4daff81c520a82678e1ef347f2b5e97258101ae1 ^09a48eb7acd594dce52e06681be9c366e1844d66
Reading pipe: git cat-file commit 4daff81c520a82678e1ef347f2b5e97258101ae1
current change 26907
trying: earliest ^09a48eb7acd594dce52e06681be9c366e1844d66 latest 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git rev-list --bisect 4daff81c520a82678e1ef347f2b5e97258101ae1 ^09a48eb7acd594dce52e06681be9c366e1844d66
Reading pipe: git cat-file commit 4daff81c520a82678e1ef347f2b5e97258101ae1
current change 26907
trying: earliest ^09a48eb7acd594dce52e06681be9c366e1844d66 latest 4daff81c520a82678e1ef347f2b5e97258101ae1
Reading pipe: git rev-list --bisect 4daff81c520a82678e1ef347f2b5e97258101ae1 ^09a48eb7acd594dce52e06681be9c366e1844d66
Reading pipe: git cat-file commit 4daff81c520a82678e1ef347f2b5e97258101ae1
current change 26907
...
     

修复方法有两个:

     
      
  • 检测到无限循环并立即死亡,而不是永远循环下去;
  •   
  • 通过明确将git rev-list --bisectlatestCommit范围中排除,确保rev-list不能再次返回“ AAA|BBB|CCC zzz|100|xy zzz|50|xy xxx|200|xy xxx|100|xy zzz|300|xz zzz|400|xz xxx|200|xz xxx|700|xz ”。
  •