Как я могу сделать git rev-list --bisect пропустить определенные коммиты? - PullRequest
1 голос
/ 29 марта 2012

Я пишу скрипт, который выполняет бинарный поиск, чтобы назначить вину за неудачные тесты.Я использую git rev-list --bisect.

Я бы хотел исключить определенные коммиты, когда сборка нарушена.git bisect имеет возможность сделать это, с git bisect skip BROKENCOMMIT.Тем не менее, я не могу найти эквивалентный способ сделать то же самое, используя git rev-list --bisect.Есть ли один?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июля 2019

В качестве побочного эффекта git rev-list --bisect не пропуск любой коммит, gitCommitByP4Change (от git p4 в git-p4.py) может войти в бесконечный цикл.

См. коммит d15068a , коммит 607a3be , коммит a2bee10 , коммит d604520 , коммит ff8c50e , коммит f2768cb , коммит b30efb1 , коммит 2dda741 (01 апреля 2019) от Мазо, Андрей (``) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 44275f5 , 09 июля 2019 г.)

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" снова, явно исключив его из диапазона * 1072.
0 голосов
/ 31 марта 2012

К сожалению, нет способа указать 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 не позволяет вам указать пространство имен ref, поэтому, если уже существует существующий раздел, вы перезаписываете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...