git post-commit hook — скрипт для зафиксированных файлов

Могу ли я где-нибудь увидеть пример хука после фиксации для запуска скрипта для каждого зафиксированного файла?

eg.

git add file1
git add file2

git commit -am "my commit"

и хук выполняет:

myscript -myparams "file1"
myscript -myparams "file2"

Лучше всего было бы иметь параметр для команды фиксации, запускающей этот хук или нет, например. git commit -X… выполняет этот хук фиксации сообщения. В конце концов псевдоним вроде git-commitx.

Как насчет той же версии, что и префикс для файлов в индексе? Могу ли я прервать фиксацию, если выполнение скриптов не выполняется в одном из файлов?

Редактировать:

Вот что у меня есть сейчас:

#!/bin/sh                                     
#.git/hooks/post-commit
dir=`pwd`
echo ----------------------------------------------
echo PHP Mess Detector results for commited files:
echo ----------------------------------------------
git show --pretty="format:" --name-only  | grep '\.php$' | xargs -i phpmd $dir/'{}' text codesize,unused$
echo ----------------------------------------------

person takeshin    schedule 01.09.2010    source источник


Ответы (1)


Предполагая, что сценарий, который вы выполняете для каждого файла, не может быть настроен на немедленный сбой при сбое одного аргумента, вы не можете использовать эту настройку 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...
person Cascabel    schedule 01.09.2010