首页 > 解决方案 > 需要在新的 Git 标签上运行一个“挂钩”(新拉标签的 Git 挂钩)

问题描述

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

但我不明白那是什么钩子或它是如何使用的。我只是想运行一个小脚本,如果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,但我不能为空格词加上别名,或者我不能为某些东西加上别名并强制团队的其他成员记住它。

标签: bashgitgithooks

解决方案


正如文档所说,接收后和更新挂钩是“服务器”端挂钩,即它们在服务器上运行以响应来自客户端的推送。你想要的是相反的,不幸的是没有钩子。

既然你提到别名命令不起作用,你可以使用一个函数作为下一个最好的东西。它将接收可以检查的参数。

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

在隐藏这样的命令时必须小心,以免导致无限递归。在函数体中,绝对不能git直接调用,因为那样会重新运行函数,而不是git命令。我习惯于env解析实际的git二进制文件,但使用绝对路径也可以。

请注意,它实际上git fetch将获取新标签并git pull简单地在内部调用git fetch。因此,我包括对fetch和的处理pull。另请注意,它会影响所有存储库中的 git 命令,因此如果特殊处理仅应用于特定存储库,则需要对其进行扩展。

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

  • 可以将更改推送到该文件的任何人基本上都可以在发生拉取的任何机器上运行任意命令。
  • 由于pullorfetch命令可以在工作树中的任何位置运行,而不仅仅是在顶层,因此应该首先使用[env] git rev-parse --show-toplevel.

推荐阅读