我使用 gitolite 和 post-receive hook 来部署网站。
目前脚本非常简单,但我们想添加更复杂的东西,比如测试、部署、编译步骤等。
为了做到这一点,我想将 post-receive Hook 分成多个单独的文件。即 post-receive.deploy、post-receive.compile、post-receive.test 等。还有一个中央 post-receive Hook 来按顺序调用它们。这样我们就可以更轻松地管理步骤。
问题是;如何从中央接收后 Hook 调用单独的(子) Hook ?我什至无法让它们执行,据我所知,我需要将 STDIN 传递给子钩子(Hook)。就 shell 脚本编写而言,我几乎是个菜鸟。
最佳答案
您可以让您的 post-receive
Hook 成为如下包装脚本:
#!/bin/sh
log() { printf %s\\n "$*"; }
warn() { log "WARNING: $@" >&2; }
mydir=${0%/*}
add_hook() {
case $1 in
/*) h=$1;;
*) h=${mydir}/$1;;
esac
[ -x "${h}" ] || {
warn "ignoring hook '$1' (not executable)"
continue
}
# XXX ${h} must not contain anything in ${IFS}
hooks="${hooks} ${h}"
}
run_hooks() {
# read input from Git, preserving trailing newlines if any
input=$(cat && echo eoi)
input=${input%eoi}
for h in ${hooks}; do
# no need to break the loop if a hook returns error -- the
# exit codes are ignored
printf %s "${input}" | "${h}" "$@"
done
}
add_hook git_multimail.py
add_hook some-other-post-receive-hook
add_hook yet-another-post-receive-hook
run_hooks "$@"
使用此包装器,您可以通过 add_hook
函数声明要运行的任何钩子(Hook)。当调用 run_hooks 函数时,包装器从 Git 读取输入并将其保存在变量中,以便它可以重播每个声明的钩子(Hook)的输入。
关于git - 从另一个钩子(Hook)调用一个 git 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25671241/