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
相关产品推荐
相关产品推荐

