git post-commit hook - скрипт для зафиксированных файлов - PullRequest
6 голосов
/ 01 сентября 2010

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

например.

git add file1
git add file2

git commit -am "my commit"

и крюк выполняет:

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

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

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

Edit:

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

#!/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 ----------------------------------------------

1 Ответ

6 голосов
/ 01 сентября 2010

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