在Push触发的GitHub Actions工作流中如何获取PR基准分支?
在Push触发的GitHub Actions中获取PR基准分支(无需GH REST API)
可以通过Git命令直接从远程引用中推导,不需要调用GH REST API,步骤如下:
第一步:匹配对应PR编号
Push事件上下文里的$GITHUB_SHA就是当前推送分支的提交SHA,用它匹配远程仓库中refs/pull/<PR号>/head的引用,提取PR编号:PR_NUMBER=$(git ls-remote | grep "$GITHUB_SHA" | grep -E 'refs/pull/[0-9]+/head' | sed -E 's/.*refs\/pull\/([0-9]+)\/head/\1/')第二步:获取PR基准分支的提交SHA
GitHub会为每个PR生成refs/pull/<PR号>/merge虚拟引用,这个合并提交的第二个父节点就是PR基准分支的最新提交SHA:# 获取merge引用的SHA MERGE_SHA=$(git ls-remote | grep "refs/pull/$PR_NUMBER/merge" | awk '{print $1}') # 提取merge提交的第二个父节点SHA(基准分支SHA) BASE_SHA=$(git cat-file -p $MERGE_SHA | grep -A1 'parent' | tail -n1 | awk '{print $1}')注:如果本地仓库没拉取过这些PR引用,先执行
git fetch origin refs/pull/*:refs/pull/*确保能访问到refs/pull下的内容。第三步:匹配基准分支名称
用基准分支的SHA匹配远程仓库的分支引用,得到分支名称:BASE_BRANCH=$(git ls-remote | grep "$BASE_SHA" | grep 'refs/heads/' | sed -E 's/.*refs\/heads\/(.*)/\1/')第四步:查看PR变更文件
直接对比基准分支SHA和当前推送的SHA,列出变更文件:git diff --name-only $BASE_SHA $GITHUB_SHA
注意事项
- 该方法依赖GitHub自动生成的
refs/pull/<PR号>/merge引用,若PR处于不可合并状态(比如冲突),这个引用可能不存在,此时可以考虑用git merge-base命令在本地计算基准,但需要先拉取基准分支的内容。 - 如果同一个SHA对应多个分支(比如分支合并后的情况),
BASE_BRANCH可能返回多个结果,需要根据实际场景做额外过滤。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

