Цепочка git крючки
Как известно многим из вас, в git может быть только один тип крюка.
Если необходимо проверить два крючка обновления. Администратор git имеет два неуправляемых решения:
- Объединить скрипты hook
- Вручную свяжите их с помощью
exec
Я ищу элегантное решение (написанное в BASH), что-то вроде папки hooks/update.d
или hooks/post-receive.d
, которая позволит свободно связывать оценки крючка. Цепь должна останавливаться, как только крюк выходит из строя.
Я действительно нашел приемлемое решение, написанное в perl по этому URL http://blog.bluefeet.net/2011/08/chained-git-hooks
Проблема: на моем сервере запущены разные версии perl, и я получаю несоответствия версии perllib. Он терпит неудачу.
Ответы
Ответ 1
После дальнейшего исследования и тестирования, это рабочее решение:
создать файл .git/hooks/hook-chain
следующим образом
#!/bin/bash
#
# author: orefalo
hookname=`basename $0`
FILE=`mktemp`
trap 'rm -f $FILE' EXIT
cat - > $FILE
for hook in $GIT_DIR/hooks/$hookname.*
do
if test -x "$hook"; then
# echo $hook
cat $FILE | $hook "[email protected]"
status=$?
if test $status -ne 0; then
echo Hook $hook failed with error code $status
exit $status
fi
fi
done
Теперь свяжите любой крючок, который требует цепочки, например
-
Обновление
- ln -s hook-chain
- ln -s post-receive с цепочкой захвата
наконец, создайте цепочки, переименовав их как hookname
. action
-rwxr-xr-x. 1 git git 6710 functions
-rwxr-xr-x. 1 git git 280 hook-chain
-rwxr-xr-x. 1 git git 1524 post-mirror
lrwxrwxrwx. 1 root root 10 post-receive -> hook-chain
-rwxr-xr-x. 1 git git 8763 post-receive.1email
-rwxr-xr-x. 1 git git 1745 post-receive.2github
-rwxr-xr-x. 1 git git 473 post-upload-pack
-rwxr-xr-x. 1 git git 346 pre-receive
lrwxrwxrwx. 1 root root 10 update -> hook-chain
-rwxr-xr-x. 1 git git 2975 update.1acl
-rwxr-xr-x. 1 git git 328 update.2github
например, в примере выше, крюк обновления будет запускать update.1acl, а затем update.2github.
post-receive hook с запуском post-receive.1email, за которым следует post-receive.2github
Ответ 2
Для тех, кто не желает нажимать на каждую ссылку в комментариях ниже другого ответа, здесь практически не изменена версия script @HenrikN:
#!/bin/bash
# Runs all executable hookname-* hooks and exits after,
# if any of them was not successful.
#
# Based on
# http://osdir.com/ml/git/2009-01/msg00308.html
data=$(cat)
exitcodes=()
hookname=$(basename $0)
# Run each hook, passing through STDIN and storing the exit code.
# We don't want to bail at the first failure, as the user might
# then bypass the hooks without knowing about additional issues.
for hook in $GIT_DIR/hooks/$hookname-*; do
test -x "$hook" || continue
echo "$data" | "$hook"
exitcodes+=($?)
done
# If any exit code isn't 0, bail.
for i in "${exitcodes[@]}"; do
[ "$i" == 0 ] || exit $i
done
Ответ 3
Я создал оболочку script на основе сообщений OP и Olivier Refalo (с некоторыми изменениями):
https://gist.github.com/amirbawab/e9f42ef8d441316707d9b90777e5718b
script создаст файлы с крючками, которые будут выполнять скрипты внутри $hook_file_name.d/$hook_file_name.*
Например: для commit-msg
hook, script сгенерирует commit-msg
файл в .git/hooks
, который выполнит все script под commit-msg.d/
.
Файлы под commit-msg.d
должны соответствовать шаблону commit-msg.*
, чтобы разрешить размещение файлов-помощников в этой папке без их выполнения.
Script Использование: ./extend_git_hooks.sh [REPO_PATH]