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

如何在Git的post-receive钩子中获取已提交文件列表?

完善Git post-receive钩子:筛选指定文件并执行任务

没问题,我来帮你把这个post-receive钩子脚本补全,实现当特定文件myFile被更新时执行任务的逻辑。

完整脚本实现

#!/bin/bash

# 遍历Git传来的更新记录
while read oldrev newrev refname
do
    # 可选:如果只关心特定分支(比如main),可以加这个判断
    # branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    # if [ "$branch" != "main" ]; then
    #     continue
    # fi

    # 获取本次提交中变更的所有文件名(仅显示文件名)
    changed_files=$(git diff --name-only $oldrev $newrev)

    # 遍历每个变更的文件
    for file in $changed_files
    do
        # 判断是否是我们要监控的文件
        if [ "$file" = "myFile" ]; then
            # 这里写你要执行的特定任务
            echo "检测到myFile被更新,开始执行任务..."
            # 示例任务:cp /path/to/repo/myFile /target/directory/
            # 或者其他自定义命令
        fi
    done
done

关键部分解释

  • git diff --name-only $oldrev $newrev:这个命令会对比更新前后的两个版本(oldrev是更新前的版本哈希,newrev是更新后的版本哈希),只输出发生变更的文件名,正好满足我们筛选目标文件的需求。
  • 循环遍历变更文件:通过for file in $changed_files逐个检查每个变更的文件,当匹配到myFile时触发预设的特定任务。
  • 可选分支过滤:如果你的钩子只需要针对特定分支生效,可以取消注释那段分支判断的代码,把main换成你需要监控的分支名称即可。

注意事项

  1. 确保钩子脚本有可执行权限:执行chmod +x post-receive给脚本加上执行权限,否则Git不会运行它。
  2. 裸仓库的特殊处理:如果你的仓库是裸仓库(没有本地工作目录),直接访问文件可能需要用git show $newrev:myFile来获取文件内容,而不是直接读取本地文件路径。
  3. 环境变量问题:在钩子脚本中,Git的环境变量可能和你平时使用的不一样,如果执行任务时遇到路径问题,可以手动指定绝对路径来避免错误。

内容的提问来源于stack exchange,提问作者Emre Öztürk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:22:55