如何获取PR所有提交中的全部文件及其状态
解决GitHub Action中获取PR所有文件状态的问题
要在GitHub Action中获取PR所有文件的新增/修改/删除状态,你可以用以下几种方案:
方案1:用git diff对比基准分支与PR分支
直接对比PR的目标分支和PR分支的差异,就能拿到所有变更文件的状态:
git diff --name-status origin/${{ github.base_ref }}...origin/${{ github.head_ref }}
输出示例:
M data/foo.txt A data/bar.txt
状态码说明:A=新增,M=修改,D=删除,R=重命名等。
之前的
git diff --name-status -r HEAD^1 HEAD仅对比最后一次提交,而PR可能包含多个提交,所以需要对比分支间的整体差异。
方案2:用gh CLI结合jq推导状态
利用gh pr view返回的additions和deletions字段,通过jq判断文件状态:
gh pr view ${PR_NUMBER} --json files | jq '.files[] | {path: .path, status: (if .deletions == 0 then "A" elif .additions == 0 then "D" else "M" end)}'
输出示例:
{ "path": "data/foo.txt", "status": "M" } { "path": "data/bar.txt", "status": "A" }
方案3:用GitHub REST API直接获取状态
调用GitHub官方API的PR文件接口,直接返回每个文件的状态:
在GitHub Action中可以用actions/github-script实现:
- name: 获取PR文件及状态 uses: actions/github-script@v6 id: pr-files with: script: | const files = await github.rest.pulls.listFiles({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.issue.number }); return files.data.map(file => ({path: file.filename, status: file.status})); result-encoding: json
之后可以通过${{ steps.pr-files.outputs.result }}获取带状态的文件列表,返回的status字段值包括added、modified、removed等。
内容的提问来源于stack exchange,提问作者patrickhawley
相关产品推荐
相关产品推荐

