如何在GitHub Actions的push工作流中获取PR合并前最后一次提交SHA
GitHub Actions Push 工作流获取PR合并前末次提交SHA方案
实现逻辑
我们通过合并提交的特征做两步判断和取值,完全适配你给出的仅监听master分支push事件的配置:
- 识别当前push是否由PR合并触发,非合并场景直接终止后续流程
- 从PR合并生成的提交的父节点中提取PR内最后一次提交的SHA值
完整工作流配置
name: Get PR last commit SHA on master push on: push: branches: - master jobs: process-pr-merge: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: # 需拉取至少2条提交记录才能获取合并提交的父节点信息 fetch-depth: 2 - name: Judge whether the push is triggered by PR merge id: check_merge_trigger run: | CURRENT_COMMIT_MSG=$(git log --format=%B -n 1 ${{ github.sha }}) # 匹配GitHub默认PR合并提交的信息前缀 if [[ ! "$CURRENT_COMMIT_MSG" =~ ^Merge\ pull\ request\ \# ]]; then echo "skip_run=true" >> $GITHUB_ENV echo "Current push is not a PR merge event, all subsequent steps will be skipped." exit 0 fi - name: Extract the last commit SHA in the PR if: ${{ !env.skip_run }} run: | # 合并提交的第二个父节点即为PR内的最后一次提交 PR_LAST_COMMIT_SHA=$(git rev-parse ${{ github.sha }}^2) echo "PR_LAST_COMMIT_SHA=$PR_LAST_COMMIT_SHA" >> $GITHUB_ENV echo "The last commit SHA of the merged PR is: $PR_LAST_COMMIT_SHA" - name: Your custom business steps if: ${{ !env.skip_run }} run: | # 后续步骤可直接通过环境变量调用获取到的SHA echo "Running business logic with PR SHA: ${{ env.PR_LAST_COMMIT_SHA }}"
特殊场景说明
上述方案仅适用于PR合并采用默认创建合并提交模式的仓库,如果你使用其他合并模式需要调整逻辑:
- 若使用Squash合并:合并后仅生成1个提交,无PR侧父节点,可从提交信息中提取PR编号后调用GitHub REST API获取PR末次提交SHA
- 若使用Rebase合并:不会生成独立的合并提交,无法通过当前push事件的提交特征判断触发源,建议额外监听
pull_request_target事件做对应逻辑处理
内容的提问来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

