【问题标题】:Multiple git hooks for the same trigger同一个触发器的多个 git 钩子
【发布时间】:2015-07-18 05:15:57
【问题描述】:

我有一个 post-checkout 钩子,我在我的所有存储库中都在本地使用它(它将我的 tmux 会话重命名为 repo-name/branch-name

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

我不想把我个人的钩子的逻辑加到全队的钩子里,因为它不是对每个人都有用,但我也不想放弃。

有没有办法在一个 git-hook 触发器上执行多个脚本?我希望每个 git checkout 都执行整个团队的 post-checkout 钩子并且执行我个人的 post-checkout 钩子。我不能将两个文件命名为相同的东西——有没有办法解决这个问题?

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

但是,现在我们有一个自动设置步骤,将 post-checkout 复制到 hooks 目录中。如果可能的话,我希望以一种不干扰现有团队设置的方式执行此操作,并且如果我稍后再次运行该安装步骤,则不需要我手动调整。

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

【问题讨论】:

  • 重命名这两个脚本并有第三个名为 post-checkout 的脚本同时调用它们有什么问题?
  • 如果自动设置将一些名为post-checkout 的文件复制到hooks 文件夹中,那么这就是Git 将用于该挂钩的文件;您对此无能为力。恐怕您需要在此处进行一些手动调整。毕竟,post-checkout 是一个客户端钩子。如果您的团队想要执行某些政策,他们应该不理会客户端挂钩(它们是您的业务,而不是您的团队的业务),而是使用服务器端挂钩。

标签: git githooks


【解决方案1】:

当然。创建一个包装器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)。

【讨论】:

  • 这是一个很好的解决方案,可能是我走的路。作为回应,我稍微扩展了我的问题;我很想知道是否有办法在不干扰现有设置的情况下做到这一点。
  • 我不认为这是一种有效的方法,因为像“git review”这样的一些工具会覆盖默认的钩子触发器。实现这一点的唯一安全方法是让 git 本身支持多个触发器。
  • git review 仅在您要求时覆盖默认挂钩触发器。您可以毫无问题地手动配置git review 挂钩。一般来说,我认为 anything 不应该在未经您许可的情况下覆盖您的 git 钩子;如果有什么东西,那东西就坏了。
  • 请注意,虽然这对于接收参数的钩子(例如 post-checkout)非常有效,但它不适用于在标准输入上接收数据的钩子,例如 post-receive
  • @Steve,为你解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2020-10-09
相关资源
最近更新 更多