Pertanyaan Chaining git hook


Seperti banyak dari Anda mungkin tahu, hanya ada satu jenis pengait di git.  Jika dua pengait pembaruan perlu dievaluasi. Admin git yang tersisa dengan dua tidak terkendali solusi:

  1. Gabungkan skrip kait bersama
  2. Secara manual rantai mereka dengan exec

Saya mencari solusi elegan (ditulis dalam BASH), sesuatu seperti folder hooks/update.d atau hooks/post-receive.d yang akan memungkinkan penggabungan secara longgar dari evaluasi hook. Chaining harus berhenti segera setelah hook gagal.

Saya benar-benar menemukan solusi yang dapat diterima yang ditulis dalam perl di URL ini http://blog.bluefeet.net/2011/08/chained-git-hooks

Masalahnya: server saya menjalankan versi perl yang berbeda dan saya mendapatkan ketidakcocokan versi perllib. Gagal.


32
2018-01-04 16:45


asal


Jawaban:


Setelah penyelidikan dan pengujian lebih lanjut, berikut ini solusi yang berfungsi:

buat file .git/hooks/hook-chain sebagai berikut

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

Sekarang tautkan hook apa pun yang memerlukan chaining, misalnya

  • Pembaruan rantai pengait
  • Pada pasca-penerimaan hook-chain

akhirnya, buat rantai dengan mengganti nama mereka menjadi 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

misalnya, dalam contoh di atas, perbarui pengait akan berlari update.1acl diikuti oleh update.2github.

Itu hook setelah menerima dengan lari post-receive.1email diikuti oleh post-receive.2github


32
2018-01-04 21:35



Bagi mereka yang tidak mau mengklik setiap tautan di komentar di bawah jawaban lainnya, inilah versi yang secara praktis tidak dimodifikasi naskah oleh @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
2018-03-08 04:54



Saya membuat skrip shell berdasarkan entri OP dan Olivier Refalo (dengan beberapa modifikasi):

https://gist.github.com/amirbawab/e9f42ef8d441316707d9b90777e5718b

Script akan menghasilkan file hook yang akan mengeksekusi skrip di dalamnya $hook_file_name.d/$hook_file_name.*

Misalnya: untuk commit-msg hook, skrip akan menghasilkan commit-msg file di bawah .git/hooks yang akan mengeksekusi semua skrip di bawah commit-msg.d/.

File di bawah commit-msg.d harus sesuai dengan pola commit-msg.* untuk memungkinkan menempatkan file shell pembantu di folder tersebut tanpa mengeksekusi mereka.

Penggunaan skrip: ./extend_git_hooks.sh [REPO_PATH]


0
2018-06-18 04:40