从另一个钩子调用一个git钩子

时间:2014-09-04 17:06:38

标签: git githooks gitolite git-post-receive

我使用gitolite和post-receive hook来部署网站。

目前脚本非常简单,但我们想添加更复杂的东西,比如测试,部署,编译步骤等。

为了做到这一点,我想将post-receive挂钩拆分成多个单独的文件。即post-receive.deploy,post-receive.compile,post-receive.test等。一个中央post-receive挂钩按顺序调用它们。这样我们就可以更轻松地管理这些步骤。

问题是;如何从中央接收后挂钩调用单独的(子)挂钩?我甚至无法执行它们,据我所知,我需要将STDIN传递给子钩子。就shell脚本而言,我几乎是一个n00b。

1 个答案:

答案 0 :(得分:2)

您可以将post-receive挂钩作为包装脚本,如下所示:

#!/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函数声明要运行的任何挂钩。当调用run_hooks函数时,包装器从Git读取输入并将其保存在变量中,以便它可以重放每个声明的钩子的输入。