Post-receive Git钩子:实现针对files目录新增文件的循环执行Python脚本逻辑
Post-receive Git钩子:实现针对files目录新增文件的循环执行Python脚本逻辑
没问题,这完全可以通过Git的post-receive钩子实现,我给你一步步拆解逻辑和具体代码:
核心思路
利用Git的post-receive钩子(推送完成后自动触发的脚本),先筛选出本次push中files目录下新增的文件,再循环遍历这些文件,逐个将文件路径作为参数调用你的Python脚本。
具体实现步骤
1. 创建/配置post-receive钩子文件
Git仓库的钩子都存放在.git/hooks目录下。你需要:
- 复制默认的示例文件(如果存在):
cp .git/hooks/post-receive.sample .git/hooks/post-receive - 或者直接新建文件:
touch .git/hooks/post-receive - 给文件添加可执行权限:
chmod +x .git/hooks/post-receive
2. 编写钩子脚本内容
用文本编辑器打开.git/hooks/post-receive,写入以下Shell脚本(根据你的实际需求修改分支名、Python脚本路径等):
#!/bin/bash # 遍历本次推送的所有分支(一次推送可能包含多个分支) while read OLD_COMMIT NEW_COMMIT REF_NAME; do # 只处理你关心的分支,比如main分支,按需修改 if [[ "$REF_NAME" != "refs/heads/main" ]]; then continue fi # 获取本次push中,files目录下新增的所有文件 # --diff-filter=A:仅筛选新增(Added)的文件 # --name-only:仅输出文件路径,不显示diff内容 # grep "^files/":只保留files目录开头的文件 NEW_FILES=$(git diff --name-only --diff-filter=A "$OLD_COMMIT" "$NEW_COMMIT" | grep "^files/") # 如果没有符合条件的新增文件,直接跳过 if [[ -z "$NEW_FILES" ]]; then echo "No new files added in 'files' directory, skipping script execution." continue fi # 循环每个新增文件,执行Python脚本 for FILE in $NEW_FILES; do echo "Processing new file: $FILE" # 替换为你的Python脚本的实际路径,$FILE会作为参数传入脚本 python3 /path/to/your/script.py "$FILE" # 可选:添加日志记录,把输出和错误写入日志文件 # python3 /path/to/your/script.py "$FILE" >> /var/log/git_hook.log 2>&1 done done
关键部分解释
- post-receive钩子输入:脚本会从标准输入读取每行的
OLD_COMMIT NEW_COMMIT REF_NAME,分别对应推送前的提交ID、推送后的提交ID、推送的分支名,我们可以通过分支名判断只处理特定分支。 - Git diff筛选:
git diff --name-only --diff-filter=A精准找出本次推送中新增的文件,再通过grep过滤出files目录下的目标文件。 - 循环执行脚本:通过
for循环遍历所有符合条件的新增文件,每次将文件路径作为参数传给Python脚本,实现新增N个文件就执行N次脚本的效果。
注意事项
- 确保钩子文件有可执行权限:如果忘记加
chmod +x,Git会忽略这个钩子。 - 路径正确性:Python脚本的路径建议用绝对路径,避免因钩子执行的工作目录不同导致找不到脚本。
- 错误处理:如果需要捕获Python脚本的执行失败,可以在循环内添加判断,比如:
python3 /path/to/your/script.py "$FILE" if [ $? -ne 0 ]; then echo "Script failed to process $FILE" >> /var/log/git_hook_error.log fi
实际效果示例
假设本次push在files目录下新增了3个文件:files/report.pdf、files/images/photo.png、files/data.csv,钩子会依次执行:
python3 /path/to/your/script.py "files/report.pdf" python3 /path/to/your/script.py "files/images/photo.png" python3 /path/to/your/script.py "files/data.csv"
备注:内容来源于stack exchange,提问作者user22523246
相关产品推荐
相关产品推荐

