Как запустить тесты для всех коммитов во время переустановки

У меня есть ветвь с множеством коммитов.

A---B---C     master
 \
  \-B'---C'---D'...---Z'  feature

Я работаю над feature, но другой разработчик создал commits B и C. Теперь я хочу переустановить feature на commit C, но я и/или automerge представил ошибки во время rebase. Мой проект имеет очень хорошее покрытие для тестирования, и я могу запускать тесты с консоли с помощью ant rebuild test, и теперь я хочу, чтобы git сказал мне, какая фиксация является первой фиксацией, которая прерывает мой тест, поэтому я могу исправить это сообщение. Как я могу это сделать?

Ответ 1

Пока вы находитесь на ветке feature выполните:

git rebase --interactive --exec "ant rebuild test" C

Это приведет к тому, что git начнет работу с фиксацией C, воспроизведет вашу работу сверху, и она будет запускать ваши тесты после каждого фиксации, которые она применяет во время фазы воспроизведения.

Надеемся, что ваша задача ant будет иметь ненулевой код выхода, если ваши тесты не пройдут. В этом случае git остановится, как только тесты потерпят неудачу. Вы сразу же находитесь в правильном положении, чтобы внести поправки в силу, чтобы тесты снова были счастливы. После того, как вы внесли поправки, просто выполните git rebase --continue, как обычно, и git будет продолжать проверять все, что вы совершаете.

Ответ 2

Представленный в Git 2.9, теперь вы можете выполнить команду для каждой фиксации с помощью опции -x, не добавляя также --interactive.

Вместо запуска git rebase -i --exec "cmd1 && cmd2 && ..." вы можете запустить git rebase -x "cmd1 && cmd2 && ...".

Ответ 3

Чтобы добавить к отличному ответу OP yankee, Git 2. 5+ предоставит более надежный опыт git rebase --interactive --exec, особенно в случае неудачного выполнения.
На самом деле, смотрите новый --reschedule-failed-exec из Git 2.21 в последней части этого ответа.

См совершать b12d3e9 [22 мая 2015], и совершить 1d968ca [22 мая 2015] по Матьё Moy (moy).
(Объединено Junio C Hamano - gitster - в коммите a6be52e, 01 июня 2015 г.)

Команда ' exec ' отправляет текущий коммит в stopped-sha, который должен содержать исходный коммит (до ребазинга).
В результате, если команда ' exec ' завершится неудачно, следующая ' git rebase --continue ' отправит текущий коммит как ловушку после перезаписи.


Полная документация:

rebase -i: исправлена rebase -i post-rewrite неудачной команды exec

Обычно, когда " git rebase " останавливается перед завершением ребазирования, это дает пользователю возможность редактировать коммит (например, с помощью команды " edit ").
В таких случаях " git rebase " оставляет перезаписываемый sha1 коммита в "$state_dir"/stopped-sha, а последующее " git rebase --continue " вызывает этот перехват post-rewrite с этим sha1 как <old-sha1> Аргумент на post-rewrite крючок.

Случай остановки " git rebase " из-за неудачной команды " exec " отличается: он дает пользователю возможность изучить или исправить ошибку, но не перестает говорить "здесь коммит для редактирования, используйте --continue когда все готово ".
Таким образом, нет причин вызывать ловушку post-rewrite для команд exec.
Если бы пользователь переписал коммит, это было бы с ' git commit --amend ', который уже вызывал хук post-rewrite.

Исправьте поведение, чтобы:

  • не оставлять файл stopped-sha в случае неудачной команды exec,
  • и научить ' git rebase --continue ' пропускать record_in_rewritten если не найден файл git rebase --continue stopped-sha.

Чтобы упростить управление ошибочными директивами exec, связанными с перебазированием, Git 2.21 (Q1 2019) вводит --reschedule-failed-exec с " git rebase -i ", который научился повторно выполнять команду, заданную с помощью " exec " для запуска после того, как это не удалось в последний раз.

Смотрите коммит 81ef8ee, коммит 969de3f, коммит d421afa (10 декабря 2018 г.) Иоганнеса dscho (dscho).
(Объединено Junio C Hamano - gitster - в коммите d9d9ab0, 29 января 2019 г.)

rebase: ввести --reschedule-failed-exec

--exec вариант использования опции --exec - проверка правильности компиляции каждого коммита в ветке темы с помощью git rebase -x make <base>.

Однако, когда exec в такой перебазировке терпит неудачу, это не перепланировано, что в этом случае не особенно полезно.

Позвольте предложить флаг, чтобы перепланировать неудачные команды exec.

Основано на идее Пола Мореля.

Страница man git rebase теперь включает в себя:

--reschedule-failed-exec::
--no-reschedule-failed-exec::

Автоматически перепланировать команды exec которые потерпели неудачу.
Это имеет смысл только в интерактивном режиме (или когда была предоставлена опция --exec).

А также:

rebase: ввести ярлык для --reschedule-failed-exec

Немного обременительно выписывать --reschedule-failed-exec перед -x <cmd> все время; Давайте представим удобную опцию, чтобы сделать оба одновременно: -y <cmd>.

Примечание: первый коммит был возвращен в See commit e11ff89 (06 Feb 2019), а коммит 81ef8ee (10 Dec 2018) - Johannes Schindelin (dscho).
(Объединено Junio C Hamano - gitster - в коммите b966813, 09 февраля 2019 г.)

Отменить "rebase: ввести ярлык для --reschedule-failed-exec"

Этот патч был внесен только в качестве пробного "мы могли бы ввести удобный короткий вариант, если мы не хотим изменять поведение по умолчанию в долгосрочной перспективе", открывая дискуссию о том, согласны ли другие люди с осуждением текущего поведения в пользу изменения графика поведение.

Но консенсус в списке рассылки Git заключался в том, что было бы целесообразно показать предупреждение в ближайшем будущем и перевернуть default rebase.rescheduleFailedExec чтобы перепланировать rebase.rescheduleFailedExec команды exec по умолчанию.

Так что давайте вернемся к тому -y который добавил короткую опцию -y которую мы согласились, не было необходимости или нежелательно.


Также в Git 2.21 (февраль 2019 г.): " git rebase -x $cmd " не отклонял многострочную команду, даже если команда не способна обработать такую команду.
Это теперь отклонено заранее.

См. Коммит c762aad (29 января 2019 г.) Филиппа Вуда (phillipwood).
(Объединено Junio C Hamano - gitster - в коммите 96e6547, 07 февраля 2019 г.)

rebase -x: команда проверки rebase -x

Если пользователь дает пустой аргумент --exec то git создает список --exec которые он не может проанализировать. Rebease начинает работать, прежде чем выдает ошибку:

error: missing arguments for exec
error: invalid line 2: exec
You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
Or you can abort the rebase with 'git rebase --abort'.

Вместо этого проверьте наличие пустых команд перед началом ребазинга.

Также убедитесь, что команда не содержит никаких новых строк, поскольку формат списка задач не справляется с многострочными командами.
Обратите внимание, что это меняет поведение, прежде чем это можно сделать:

git rebase --exec='echo one
exec echo two'

и было бы вставить две EXEC строки в todo списке, теперь выдаст ошибку.


В Git 2.23 переменная конфигурации rebase.rescheduleFailedExec должна быть эффективна только при выполнении интерактивной перебазировки и не должна влиять на что-либо при запуске неинтерактивной -i, что не имело место.
Это было исправлено.

См. Коммит 906b639 (01 июля 2019 г.) Йоханнеса dscho (dscho).
(Объединено Junio C Hamano - gitster - в коммите 64096fb, 11 июля 2019 г.)

rebase --am: игнорировать rebase.rescheduleFailedExec

Команда exec специфична для интерактивного бэкэнда, поэтому нетрадиционным ребятам -i не имеет смысла учитывать эту настройку конфигурации.

Мы по-прежнему хотим выдавать ошибку, если, конечно, не [n02] нетерабельная перезагрузка запускается с --reschedule-failed-exec.

Об этом сообщает Vas Sudanagunta через commit 969de3f.