Github Actions中PR及合并后获取修改文件的方案咨询
解决GitHub Actions合并main分支后获取修改文件的问题
问题根源
合并至main分支的工作流默认已检出最新的main分支,原脚本里的git fetch origin main:main命令会报错,因为Git不允许将远程分支fetch到当前已检出的本地分支。移除该命令后无法拿到正确文件列表,是因为原PR场景的逻辑依赖对比PR分支与main分支,而合并后当前分支就是main,需要换一种方式获取本次合并带来的修改。
可行解决方案
方案1:用Git对比合并前后的提交
合并完成后,当前HEAD是合并后的提交,直接对比它与合并前main分支的最后一次提交,就能拿到本次合并的修改文件,同时过滤掉删除的文件:
# 提取本次合并新增/修改的文件(排除已删除的) git diff --name-only --diff-filter=ACMRT HEAD^ HEAD
--diff-filter=ACMRT参数会筛选出添加(A)、复制(C)、修改(M)、重命名(R)、类型变更(T)的文件,自动排除删除(D)的文件。
方案2:借助GitHub CLI获取PR修改文件
如果工作流是在PR合并触发的pull_request事件(type: closed且merged: true)中运行,可以直接通过GitHub CLI拉取对应PR的修改文件列表:
# 从事件文件中提取PR编号 PR_NUMBER=$(jq -r '.pull_request.number' "$GITHUB_EVENT_PATH") # 获取PR中未被删除的文件路径 gh pr view $PR_NUMBER --json files --jq '.files[] | select(.status != "removed") | .path'
注意:如果工作流环境未预装GitHub CLI,需要先执行sudo apt-get install gh -y完成安装。
方案3:修正原脚本的fetch逻辑(适配原有脚本结构)
如果要保留原PR脚本的大致结构,不要直接fetch到当前main分支,而是fetch到临时分支,再进行对比:
# 将远程main分支fetch到临时分支 git fetch origin main:temp-main # 对比临时分支与合并前的main提交(HEAD^),获取修改文件 git diff --name-only --diff-filter=ACMRT HEAD^ temp-main
关键配置注意
无论用哪种方案,都要确保checkout步骤拉取完整的提交历史,避免浅克隆导致无法对比历史提交:
- name: 检出代码 uses: actions/checkout@v4 with: fetch-depth: 0
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

