同一触发器的多个 git 挂钩

Multiple git hooks for the same trigger

我有一个 post-checkout 挂钩,我在所有回购协议中都在本地使用它(它将我的 tmux 会话重命名为 repo-name/branch-name

对于我正在处理的项目,我们刚刚添加了一个 post-checkout 挂钩,我们要求整个团队使用它。

我不想把我个人hook的逻辑加入到团队范围的hook中,因为它对每个人都没有用,但我也不想放弃。

有没有办法让多个脚本在单个 git-hook 触发器上执行?我希望每个 git checkout 执行团队范围的 post-checkout 挂钩 执行我个人的 post-checkout 挂钩。我不能让两个文件同名 - 有没有办法解决这个问题?

更新: 一个好的方法是,“让 post-checkout 调用另外两个脚本。我喜欢这个想法,它可能是解决方案。

但是,现在我们有一个自动设置步骤,可以将 post-checkout 复制到 hooks 目录中。如果可能的话,我希望以一种不会干扰现有团队设置的方式进行,并且如果我 运行 稍后再安装步骤。

如果那不可能,那很好,但我对更有创意的解决方案很好奇。

当然可以。创建一个包装器 post-checkout 调用其他脚本的钩子脚本:

#!/bin/sh

$GIT_DIR/hooks/my-tmux-post-checkout "$@"
$GIT_DIR/hooks/corporate-post-checkout "$@"

您可以更高级地迭代 post-checkout.d 目录或其他目录中的任意数量的脚本,但基本思想是相同的。

史蒂夫更新

对于需要在 stdin 上输入的脚本:

#!/bin/sh

tmpfile=$(mktemp hookXXXXXX)
trap "rm -f $tmpfile" EXIT
cat > $tmpfile

$GIT_DIR/hooks/my-tmux-post-checkout "$@" < $tmpfile
$GIT_DIR/hooks/corporate-post-checkout "$@" < $tmpfile

这对于第一种情况实际上也应该是无害的,尽管如果您通过 运行 手动测试它,您将需要确保始终从某个地方重定向标准输入(可能 /dev/null).