bash - 需要在新的 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
,但我不能为空格词加上别名,或者我不能为某些东西加上别名并强制团队的其他成员记住它。
解决方案
正如文档所说,接收后和更新挂钩是“服务器”端挂钩,即它们在服务器上运行以响应来自客户端的推送。你想要的是相反的,不幸的是没有钩子。
既然你提到别名命令不起作用,你可以使用一个函数作为下一个最好的东西。它将接收可以检查的参数。
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
在存储库本身中被跟踪,则至少需要注意两件事:
- 可以将更改推送到该文件的任何人基本上都可以在发生拉取的任何机器上运行任意命令。
- 由于
pull
orfetch
命令可以在工作树中的任何位置运行,而不仅仅是在顶层,因此应该首先使用[env] git rev-parse --show-toplevel
.
推荐阅读
- github - 在 ns-3 上构建 Quic 协议
- azure-devops - 将附件上传到 Azure devops
- usb - USB端口和(我假设)IOMMU控制器有问题
- node.js - 从导出的异步函数返回
- css - 边界半径 50% 不产生偶数圆?
- bash - 使用 GitHub Actions 循环遍历多个文件
- javascript - 如何从 url 中获取参数并在分页中使用它来根据 url 转到特定页面?角 9
- azure-devops - 我可以在另一个版本之后触发一个版本吗?
- git - git push 时出现大量文件时出错
- javascript - 如何在使用 useEffect 卸载时将状态设置为 false?