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

如何配置GitHub Workflow仅在提交新文件时执行替换操作?

实现GitHub Workflow检测新提交文件并执行查找替换

一、Workflow触发方式

GitHub没有专门检测“新文件提交”的trigger,但可以用push或pull_request作为基础触发,然后在Workflow的job里通过Git命令筛选出本次提交的新文件。

  • 针对分支直接提交的场景,用push trigger:
    on:
      push:
        branches: [ main, dev ] # 指定要监听的分支
    
  • 针对PR的场景,用pull_request trigger:
    on:
      pull_request:
        branches: [ main ]
    

二、筛选新提交的文件

在job中先checkout仓库代码,再用git diff命令提取本次提交新增的文件:

# 获取本次提交新增的文件列表,保存到变量
NEW_FILES=$(git diff --name-only --diff-filter=A HEAD~1 HEAD)

参数说明:

  • --name-only:只输出文件名
  • --diff-filter=A:仅筛选新增(Added)的文件
  • HEAD~1 HEAD:对比上一个commit和当前commit(PR场景可替换为origin/${GITHUB_BASE_REF}和HEAD,适配PR分支对比逻辑)

三、编写查找替换逻辑

遍历筛选出的新文件,用sed(跨平台通用)执行查找替换。比如把文件中的{{PLACEHOLDER}}替换成Hello World:

for file in $NEW_FILES; do
  # 检查文件存在,避免异常
  if [ -f "$file" ]; then
    # -i表示直接修改文件内容
    sed -i 's/{{PLACEHOLDER}}/Hello World/g' "$file"
    echo "已处理文件: $file"
  fi
done

四、完整Workflow示例

如果需要把替换后的文件自动提交回仓库,配置Git权限(用GitHub自带的GITHUB_TOKEN即可):

name: 处理新提交文件的查找替换

on:
  push:
    branches: [ main ]

jobs:
  replace-in-new-files:
    runs-on: ubuntu-latest
    steps:
      - name: 检出仓库代码
        uses: actions/checkout@v4
        with:
          fetch-depth: 2 # 需要拉取上一个commit用于对比

      - name: 筛选并处理新文件
        run: |
          # 获取新增文件列表
          NEW_FILES=$(git diff --name-only --diff-filter=A HEAD~1 HEAD)
          
          # 无新文件则直接退出
          if [ -z "$NEW_FILES" ]; then
            echo "本次提交没有新增文件,跳过处理"
            exit 0
          fi
          
          # 遍历执行查找替换
          for file in $NEW_FILES; do
            if [ -f "$file" ]; then
              sed -i 's/{{PLACEHOLDER}}/Hello World/g' "$file"
              echo "已处理文件: $file"
            fi
          done

      - name: 提交修改后的文件
        run: |
          # 检查是否有文件被修改
          if git diff --quiet; then
            echo "没有文件被修改,无需提交"
            exit 0
          fi
          
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git add .
          git commit -m "自动替换新文件中的占位符"
          git push
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

五、注意事项

  • 避免循环触发:示例中用github-actions[bot]提交,GitHub默认不会触发自身提交的Workflow;若需强制跳过,可在commit信息中添加[skip ci]。
  • 文件类型适配:二进制文件不要用sed处理,需根据文件类型调整替换逻辑。
  • PR场景调整:PR触发时,git diff的对比对象要换成origin/${GITHUB_BASE_REF}和HEAD,即git diff --name-only --diff-filter=A origin/${GITHUB_BASE_REF} HEAD。

内容的提问来源于stack exchange,提问作者user3310334

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:41:16