需要 运行 在新的 Git 标签上 "hook" (Git 挂钩新拉取的标签)

Need to run a "hook" on new Git Tag (Git hook for newly pulled tags)

首先,我查看了这个似乎是唯一与该主题相关的问题:

但我不明白那是什么钩子,也不知道它是如何使用的。我只是想 运行 一个小脚本,如果收到 git pull 和新标签,它会更新。

我试着把它放在:.git/hooks/update.git/hooks/post-receive

#!/bin/bash
exec < /dev/tty

CURRENT_TAG=$(git tag --contains)
echo Test Test
echo "LATEST_TAG: \"${CURRENT_TAG}"\" > "config/latest_tag.yml"

如果可能,我想使用 Git 钩子。我正在考虑做 alias "git pull"="git pull && ./update_script.sh 但我不能给一个空格词起别名,我也不能给一些东西起别名并强制团队的其他成员记住它。

the documentation says 一样,post-接收和更新挂钩是 "server" 侧挂钩,即它们 运行 在服务器上响应来自客户端的推送.你想要的是相反的,不幸的是没有钩子。

既然您提到给命令起别名是行不通的,那么您可以使用函数作为退而求其次的最佳选择。它将接收随后可以检查的参数。

git() { env git $* && [ "" = "fetch" -o "" = "pull" ] && ./update_script.sh; }

像这样隐藏命令时必须小心,不要导致无限递归。在函数体内,您绝不能直接调用 git,因为那样会重新 运行 函数,而不是 git 命令。我已经使用 env 来解析实际的 git 二进制文件,但使用绝对路径也同样有效。

请注意,实际上 git fetch 将获取新标签,而 git pull 只是在内部调用 git fetch。因此,我包括了对 fetchpull 的处理。另请注意,它将在所有存储库中隐藏 git 命令,因此如果特殊处理仅应应用于特定存储库,则需要对其进行扩展。

如果您的 update_script.sh 在存储库本身内被跟踪,至少需要注意两件事:

  • 任何可以将更改推送到该文件的人基本上都将启用运行任意命令在任何拉动的机器上发生了。
  • 由于 pullfetch 命令可能 运行 在工作树中的任何位置,而不仅仅是在顶层,因此应首先使用 [=23= 解析路径].