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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 13:54:36