You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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通知触达

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:45:06