git - 从另一个钩子(Hook)调用一个 git 钩子(Hook)

标签 git githooks gitolite git-post-receive

我使用 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/

相关文章:

指示存储库已弃用的 Git 钩子(Hook)

gitlab - Git 推送错误预接收 Hook 被拒绝

git - 当配置文件为 "$XDG_CONFIG_HOME/git/config"时如何设置 Git 配置选项?

windows - 获取所有分支的日期、散列和分支名称

git - 禁止关于默认初始分支名称的 git 警告

gitolite 在 'wild' 存储库创建上运行 Hook

git - 设置 Gitolite 时出错 : Doesn't accept SSH key

macos - 使用 Homebrew 升级 Git 时出现问题

git clone git hooks 中的不同存储库造成麻烦

ssh - gitolite无法与sshd服务一起使用