Подтвердить что ты не робот

Цепочка 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. Он терпит неудачу.

4b9b3361

Ответ 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]