如何配置GitHub Actions仅在推送新文件时触发工作流运行
实现方案
GitHub Actions 原生的工作流触发配置项,没有直接提供「仅提交新文件时触发」的过滤能力,你列出的所有配置项都无法独立实现这个需求,各配置项的实际作用如下:
branches/branches-ignore:仅能按分支名称过滤触发事件,和文件变更类型完全无关,确实无效tags/tags-ignore:仅针对标签推送事件做过滤,和普通代码提交、PR的文件变更逻辑无关,无法实现需求paths/paths-ignore:仅能匹配变更文件的路径名,无法区分文件是新增、修改还是删除状态,哪怕使用通配符也识别不了变更类型,不能直接用来实现需求types:push事件的types没有可自定义的扩展值,仅支持默认的推送触发;pull_request事件的types仅针对PR本身的状态(如创建、更新、编辑等)做过滤,无法识别提交内的文件变更类型,同样无效
可行实现方式
你可以先正常配置工作流触发规则,在工作流执行的第一步做变更检测,如果本次提交/PR没有新增文件就直接终止流程,存在新增文件时再执行后续任务,这种方案不需要枚举项目现有文件,不受目录结构变动影响。
完整配置示例:
name: Another_Action on: push: pull_request: jobs: new-file-trigger: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取足够的提交历史用于对比,PR场景下需要拉取目标分支记录 - name: 检测新增文件 id: check_added run: | if [[ "${{ github.event_name }}" == "push" ]]; then # push事件:对比当前提交和上一个提交的差异 added_files=$(git diff --name-only --diff-filter=A HEAD^ HEAD) elif [[ "${{ github.event_name }}" == "pull_request" ]]; then # PR事件:对比当前分支和PR目标分支的差异 git fetch origin ${{ github.base_ref }} added_files=$(git diff --name-only --diff-filter=A origin/${{ github.base_ref }} HEAD) fi if [[ -z "$added_files" ]]; then echo "has_added=false" >> $GITHUB_OUTPUT echo "未检测到新增文件,终止工作流" exit 0 else echo "has_added=true" >> $GITHUB_OUTPUT echo "检测到新增文件列表:" echo "$added_files" fi - name: 你的自定义任务 if: steps.check_added.outputs.has_added == 'true' run: | # 此处填写需要在新增文件时执行的业务逻辑 echo "开始执行新增文件触发的任务"
核心逻辑说明
- git diff的
--diff-filter=A参数会专门筛选状态为「新增(Added)」的文件,如果你需要同时匹配其他变更类型,可以追加对应标识:比如--diff-filter=AM代表同时匹配新增和修改的文件 - 配置
fetch-depth是为了拉取足够的git提交记录,默认checkout动作只会拉取单次提交的内容,没有历史记录无法完成差异对比 - 检测逻辑会自动适配push和PR两种触发场景,不需要手动维护路径规则,项目结构变动也不会影响检测结果
内容的提问来源于stack exchange,提问作者JumperBot_
相关产品推荐
相关产品推荐

