Chaining Git hooks
Jak wielu z Was zapewne wie, w git może być tylko jeden typ Hooka. Jeśli trzeba ocenić dwa Hooki aktualizacji. Adminowi git pozostało dwa unmanagable rozwiązania:
- Scal Skrypty Hooka razem
- łańcuch ręcznie z
exec
Szukam eleganckiego rozwiązania (napisanego w BASH), coś w rodzaju folderu hooks/update.d
lub hooks/post-receive.d
, które pozwoli na luźne łączenie hooków. Łańcuch powinien przestać jak tylko hak zawodzi.
Znalazłem akceptowalne rozwiązanie napisane w Perlu pod tym adresem URL http://blog.bluefeet.net/2011/08/chained-git-hooks
Problem: mój serwer uruchamia różne wersje Perla i dostaję niedopasowania wersji perllib. Zawiedzie.
3 answers
Po dalszych badaniach i testach, oto rozwiązanie robocze:
Utwórz plik {[2] } w następujący sposób
#!/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 "$@"
status=$?
if test $status -ne 0; then
echo Hook $hook failed with error code $status
exit $status
fi
fi
done
Teraz połącz każdy hak, który wymaga łańcuchowania, na przykład
- ln-s Hook-chain update
- ln-s Hook-chain 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
Na przykład w powyższym przykładzie, hak aktualizacji uruchomi aktualizację .1acl Aktualizacja.2github .
Post-receive hook z run post-receive.1email , po którym następuje post-receive.2github
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 02:07:09
Dla tych, którzy nie chcą klikać na każdy link w komentarzach poniżej inna odpowiedź, Oto praktycznie niezmodyfikowana wersja skryptu autorstwa @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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:30
Stworzyłem skrypt powłoki oparty na postach OP i Olivier Refalo (z pewnymi modyfikacjami):
Https://gist.github.com/amirbawab/e9f42ef8d441316707d9b90777e5718b
Skrypt wygeneruje plik Hooka, który wykona Skrypty wewnątrz $hook_file_name.d/$hook_file_name.*
Na przykład: dla commit-msg
hook, skrypt wygeneruje commit-msg
plik w .git/hooks
, który wykona wszystkie skrypty w commit-msg.d/
.
Pliki w commit-msg.d
powinny pasować do wzorca commit-msg.*
, aby umożliwić umieszczenie powłoki helpera pliki w tym folderze bez ich wykonywania.
Użycie skryptu: ./extend_git_hooks.sh [REPO_PATH]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-18 04:40:10