You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions强制推送后无法获取修改文件的解决方案咨询

解决方案

Push事件场景修复

强制推送后github.event.before对应的commit可能已被远程仓库移除,直接用它执行git diff会失败,可通过以下两种方式解决:

方式1:基于远程分支历史做容错diff

先拉取远程分支的最近两次提交历史,若远程分支存在上一个commit则做diff,否则直接获取当前提交中Animations/目录的所有文件:

- name: Get changed Animations files (Push)
  if: github.event_name == 'push'
  id: push_changes
  run: |
    set -euo pipefail
    
    # 拉取远程分支最近2次提交历史
    git fetch origin ${{ github.ref_name }} --depth=2
    
    # 尝试获取远程分支的上一个commit,首次推送时为空
    PREV_COMMIT=$(git rev-parse origin/${{ github.ref_name }}~1 2>/dev/null || echo "")
    
    if [ -n "$PREV_COMMIT" ]; then
      CHANGED=$(git diff --name-only $PREV_COMMIT ${{ github.event.after }} -- Animations/ | xargs)
    else
      CHANGED=$(git ls-tree --name-only -r ${{ github.event.after }} -- Animations/ | xargs)
    fi
    
    echo "changed_animations=$CHANGED" >> $GITHUB_OUTPUT

方式2:用GitHub API获取变更文件

直接调用GitHub REST API获取推送事件的变更文件,完全避免本地git仓库的commit依赖:

- name: Get changed Animations files (Push via API)
  if: github.event_name == 'push'
  id: push_changes
  run: |
    set -euo pipefail
    
    # 调用API获取推送的变更文件列表
    RESPONSE=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
      "https://api.github.com/repos/${{ github.repository }}/compare/${{ github.event.before }}...${{ github.event.after }}")
    
    # 过滤出Animations目录下的文件并拼接成空格分隔字符串
    CHANGED=$(echo "$RESPONSE" | jq -r '.files[]?.filename' | grep "^Animations/" | xargs)
    
    echo "changed_animations=$CHANGED" >> $GITHUB_OUTPUT

注:需确保工作流环境已安装jq工具,若未安装可提前添加安装步骤。

Pull Request场景优化(可选)

虽然PR场景下origin/${{ github.base_ref }}被强制删除的概率较低,但如果担心base分支被重写,同样可以改用API获取变更文件:

- name: Get changed Animations files (PR)
  if: github.event_name == 'pull_request'
  id: pr_changes
  run: |
    set -euo pipefail
    
    # 调用API获取PR的变更文件列表
    RESPONSE=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
      "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files")
    
    CHANGED=$(echo "$RESPONSE" | jq -r '.[]?.filename' | grep "^Animations/" | xargs)
    
    echo "changed_animations=$CHANGED" >> $GITHUB_OUTPUT

通用容错处理

无论采用哪种方式,都可以给git diff命令添加容错,避免因diff失败导致工作流中断:

# 即使diff失败也返回空字符串,不终止脚本
CHANGED=$(git diff --name-only ... -- Animations/ | xargs || true)

内容的提问来源于stack exchange,提问作者Pituivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:42:31