GitHub Action中无法列出PR与main分支差异提交的问题
你的方法存在三个核心问题:
git remote show用法错误
这个命令不带参数时会输出默认远程(通常是origin)的详细信息,而非单纯的远程名称。本地可能因为命令解析的巧合(比如取了输出的第一个有效单词)侥幸运行,但本质是错误的,应该直接使用固定远程名origin。detached HEAD状态下无法获取当前分支名
GitHub Action处理PR时,默认会checkout PR的提交到detached HEAD模式,此时没有本地分支存在,git branch --show-current会返回空值,导致你的log命令中分支范围表达式..后无内容,语法失效。默认checkout未拉取完整分支历史
GitHub Action的默认checkout步骤只会拉取当前提交的浅层历史,没有获取main分支和PR源分支的完整提交记录,导致git无法解析两者间的差异。
修正方案(无额外依赖)
步骤1:确保拉取完整仓库历史
在你的GitHub Action workflow中,修改checkout步骤以拉取完整历史:
- uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取所有分支和历史
步骤2:使用GitHub环境变量构造正确的log命令
利用GitHub Action提供的GITHUB_HEAD_REF(PR源分支名)和GITHUB_BASE_REF(目标分支名,即main),直接引用远程分支构造差异范围:
git log --pretty="format:%h" --right-only origin/$GITHUB_BASE_REF..origin/$GITHUB_HEAD_REF
替代方案(无需完整拉取)
如果不想拉取全量历史,可以单独fetch需要的分支:
# 拉取main分支 git fetch origin main:main # 拉取PR源分支 git fetch origin $GITHUB_HEAD_REF:$GITHUB_HEAD_REF # 生成差异提交列表 git log --pretty="format:%h" --right-only main..$GITHUB_HEAD_REF
另外,你之前尝试的git switch origin/$GITHUB_HEAD_REF无效,是因为该命令需要先创建本地分支,正确写法是git switch -c $GITHUB_HEAD_REF origin/$GITHUB_HEAD_REF,但这一步完全没必要,直接使用远程分支引用更简洁。
内容的提问来源于stack exchange,提问作者Jazzschmidt

