Предполагая, что скрипт, который вы выполняете для каждого файла, не может быть настроен на немедленный сбой, когда он терпит неудачу в одном аргументе, вы не можете использовать эту настройку xargs. Вы можете сделать что-то вроде этого:
#!/bin/bash
# for a pre-commit hook, use --cached instead of HEAD^ HEAD
IFS=$'\n'
git diff --name-only HEAD^ HEAD | grep '\.php$' |
while read file; do
# exit immediately if the script fails
my_script "$file" || exit $?
done
Но, может быть, phpmd
уже сделает это для вас? Не могу понять из вашего вопроса, но если это так, все, что вам нужно сделать, это убедиться, что это последняя команда в ловушке. Состояние выхода конвейера - это состояние выхода последней команды в нем (phpmd
), а состояние выхода сценария оболочки - это состояние выхода последней команды, которую он выполнил, поэтому, если phpmd
завершается со статусом ошибки , скрипт ловушки будет, и если это ловушка перед фиксацией, это заставит git прервать фиксацию.
Что касается опции git-commit для управления вызовом этого хука, вам отчасти не повезло, если только вы не считаете --no-verify
(который подавляет все хуки фиксации) достаточно хорошим. Псевдоним ... самый простой способ сделать это - установить переменную окружения в псевдониме, вероятно:
# gitconfig
[alias]
commitx = "!run_my_hook=1; git commit"
# your script
#!/bin/bash
# if the variable's empty, exit immediately
if [ -z "$run_my_hook" ]; then
exit 0;
fi
# rest of script here...