如何在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换成你需要监控的分支名称即可。
注意事项
- 确保钩子脚本有可执行权限:执行
chmod +x post-receive给脚本加上执行权限,否则Git不会运行它。 - 裸仓库的特殊处理:如果你的仓库是裸仓库(没有本地工作目录),直接访问文件可能需要用
git show $newrev:myFile来获取文件内容,而不是直接读取本地文件路径。 - 环境变量问题:在钩子脚本中,Git的环境变量可能和你平时使用的不一样,如果执行任务时遇到路径问题,可以手动指定绝对路径来避免错误。
内容的提问来源于stack exchange,提问作者Emre Öztürk
相关产品推荐
相关产品推荐

