我正在编写一个执行二进制搜索的脚本,以便为损坏的测试分配责任。我正在使用git rev-list --bisect
。
我想排除构建被破坏的特定提交。 git bisect
可以使用git bisect skip BROKENCOMMIT
选项执行此操作。但是,我找不到使用git rev-list --bisect
做同样事情的等效方法。有吗?
谢谢!
答案 0 :(得分:0)
不幸的是,没有办法告诉git rev-list --bisect
跳过某些提交。
git bisect
通过创建名为refs/bisect/skip-*
的引用来实现跳过。好的和坏的提交存储在refs/bisect/bad
和refs/bisect/good-*
中。 git rev-list --bisect
命令会查看refs/bisect/bad
和refs/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.py
,commit d15068a,commit 607a3be,commit a2bee10,commit d604520,commit ff8c50e,commit f2768cb,{{3} }(2019年4月1日)作者:commit b30efb1。
(由commit 2dda741在Mazo, 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 --bisect
从latestCommit
范围中排除,确保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
”。