Как вы git cherry-pick --continue
с --no-verify
, так как --no-verify
недопустимый вариант. git cherry-pick --no-commit --continue
не работает, так как эти два параметра взаимоисключающие.
@evolutionxbox, когда вы обычно выбираете диапазон.
Или при разрешении конфликтов
--no-verify
— это вариант команды commit
, а не cherry-pick
.
Однако вы можете использовать флаг --no-commit
для своего cherry-pick
, тогда git commit --no-verify
можно завершить выбор вишни.
--no-commit не работает с --continue. Я добавлю это в OP, чтобы быть более понятным
Вам не нужно --continue
для начальной команды cherry-pick
. Это полезно только после обработки первого выбранного коммита (и до тех пор, пока последовательность не закончится), чтобы указать секвенсору, что вы готовы обработать следующий в вашей серии коммитов.
К сожалению, этот подход не сработает, если git cherry-pick
вызвал конфликты, которые необходимо разрешить. В этом случае, после разрешения конфликтов, можно использовать только git cherry-pick --continue
для разрешения вишневого выбора, однако, если хуки перед фиксацией терпят неудачу, один застревает. Единственный вариант — прервать выборку и перезапустить с нуля, включая разрешение конфликтов слияния. Похоже, что на самом деле это не то, что должно происходить, и должен быть способ временно отключить хуки при продолжении активного выбора вишни.
@Pankrates Я использовал этот метод именно в этом сценарии. Я тщательно отобрал ряд коммитов, у некоторых из них были конфликты (и они срабатывали на моем крючке перед коммитом). Я просто исправил конфликты и сделал git add
; git commit
а потом git cherry-pick --continue
Если у вашего cherry-pick
(без --no-commit
) были конфликты слияния, и вы хотите --continue
после их решения, вы можете временно отключить git-хуки для текущего репо с помощью:
$ git config core.hooksPath # Print current setting
$ git config core.hooksPath '/dev/null/'
После того, как вы закончите, в зависимости от того, был ли ранее установлен core.hooksPath
, вы можете либо восстановить предыдущую настройку:
$ git config core.hooksPath '/some/previous/path'
или отключить его снова:
$ git config --unset core.hooksPath
Жаль, что это единственное решение
Это должен быть принятый ответ!
У меня почему-то вышеописанный способ не сработал (изменение hooksPath через git config
). Вот обходной путь: вручную зайдите в свой .git/hooks/
каталог, переименуйте оскорбительные хуки, вернитесь и закончите cherry-pick --continue
, затем переименуйте оскорбительные хуки обратно в их исходные имена.
Чтобы расширить ответ @mickdekkers, я добавил в свой ~/.bashrc
следующую функцию:
git() {
if [[ $@ == *"--no-verify"* ]];
then
command git -c core.hooksPath=/dev/null "$@ | sed 's/--no-verify//'";
else
command git "$@";
fi;
}
Это устанавливает путь к null
каждый раз, когда используется флаг --no-verify
.
Еще один возможный обходной путь — спрятать/удалить сундук перед фиксацией, так как это остановит операцию выбора вишни, чтобы можно было использовать обычную команду фиксации:
git stash
git stash pop
git add -u
git status
git commit -n
Дальнейшее расширение подхода @teejay-bruno, что я сделал:
pre-commit run
git -c core.hooksPath=/dev/null cherry-pick --continue
Таким образом, я все еще запускаю проверку, даже если некоторые элементы не работают, и выбираю вишни, не изменяя глобальную конфигурацию.
Если все конфликты разрешены, то не нужно git cherry-pick --continue
.
Просто git commit --no-verify
. Тогда процесс будет завершен.
git cherry-pick --continue
? В каком контексте это используется?