post-receive git hook能否用于特定文件变更时发送邮件通知?
Git特定文件变更的通知实现方案
以下针对你提到的两个触发场景(PR包含特定文件变更、配置文件成功更新)分别给出可直接落地的实现方式:
1. PR阶段检测与高亮提醒
针对PR创建、更新时的检测,无需修改原生Git Hook,用代码托管平台自带的CI/CD流水线即可实现:
- 第一步:在项目根目录新增检测脚本
check-config-change.sh,逻辑为对比PR源分支与目标分支的差异,匹配待监控的配置文件,示例代码如下:
#!/bin/bash # 替换为你的目标分支名,比如main、master TARGET_BRANCH="origin/main" # 提取两个分支之间所有变更的文件列表 CHANGED_FILES=$(git diff --name-only $TARGET_BRANCH...HEAD) # 替换为你要监控的配置文件路径,支持正则匹配 WATCHED_FILE="config/prod.yaml" if echo "$CHANGED_FILES" | grep -q "$WATCHED_FILE"; then # 输出标记供后续步骤使用,GitLab/Gitea可对应修改为平台的环境变量写入规则 echo "HAS_CONFIG_CHANGE=1" >> $GITHUB_ENV # 也可直接调用内部消息/邮件接口发送单独通知 fi
- 第二步:配置CI/CD触发规则,设置PR创建、更新时自动运行上述脚本,拿到
HAS_CONFIG_CHANGE=1的标记后,执行以下任意操作实现提醒:- 给PR自动打上
配置变更类的专属标签,方便审核人员快速识别 - 在PR评论区自动发送高亮提醒:注意:本次PR包含受监控的生产配置文件变更,请重点审核
- 单独给配置负责人发送邮件/即时消息通知,不用等待通用PR通知触达
- 给PR自动打上
2. post-receive阶段推送成功后通知
针对你提到的post-receive原生Hook,直接在服务端仓库的Hook文件中添加检测逻辑即可:
- 找到服务端Git仓库目录下的
hooks/post-receive文件,没有则新建,添加如下逻辑:
#!/bin/bash # 替换为你要监控的分支名,比如只监听主分支推送 WATCHED_REF="refs/heads/main" # 替换为你要监控的配置文件路径 WATCHED_FILE="config/prod.yaml" while read old_rev new_rev ref_name; do if [ "$ref_name" = "$WATCHED_REF" ]; then # 提取本次推送所有变更的文件列表 CHANGED_FILES=$(git diff --name-only $old_rev $new_rev) if echo "$CHANGED_FILES" | grep -q "$WATCHED_FILE"; then # 自定义邮件内容,可调用sendmail、smtp客户端或内部邮件服务发送 echo "配置文件 $WATCHED_FILE 已更新,提交范围:$old_rev ~ $new_rev" | mail -s "生产配置更新通知" config-admin@example.com fi fi done
- 给Hook文件添加可执行权限即可生效:
chmod +x hooks/post-receive
通用通知高亮技巧
如果你不需要单独发通知,只想在现有通用通知里突出显示特定文件变更,可以在匹配到目标文件后,在通知内容最开头插入引用块提示:
重要提醒:本次变更包含受监控的配置文件修改,请重点关注对应变更内容
也可以给目标文件路径前后加上特殊标记,在纯文本通知里也能快速被识别。
内容的提问来源于stack exchange,提问作者pHM
相关产品推荐
相关产品推荐

