如何配置GitHub Workflow仅在提交新文件时执行替换操作?
实现GitHub Workflow检测新提交文件并执行查找替换
一、Workflow触发方式
GitHub没有专门检测“新文件提交”的trigger,但可以用push或pull_request作为基础触发,然后在Workflow的job里通过Git命令筛选出本次提交的新文件。
- 针对分支直接提交的场景,用
pushtrigger:on: push: branches: [ main, dev ] # 指定要监听的分支 - 针对PR的场景,用
pull_requesttrigger: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
相关产品推荐
相关产品推荐

