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

GitHub Action检测manifest变更时返回0却触发退出码1失败

问题原因

  1. 本地缺少目标提交:GitHub Actions默认使用浅克隆(仅拉取最新1次提交),${{ github.event.before }}对应的历史提交不在本地仓库中,执行git diff时会因找不到提交而返回非0退出码。
  2. Bash严格模式触发中断:GitHub Actions的Bash默认启用-e选项,脚本中任何命令返回非0都会立即终止步骤。当git diff失败时,即使后续逻辑能正常计算结果,脚本也会直接退出。
  3. 新分支提交的特殊场景:推送新分支时,github.event.before会是全0的无效哈希,此时git diff直接报错。

解决方案

方案1:拉取完整提交历史

修改actions/checkout步骤,拉取仓库所有提交,确保目标提交存在于本地:

- name: Checkout code
  uses: actions/checkout@v4
  with:
    fetch-depth: 0  # 拉取全部提交历史

方案2:优化脚本容错逻辑

调整脚本,处理无效提交哈希,并避免-e选项中断执行:

- name: Check for version change
  id: check_version
  run: |
    git fetch origin main
    # 处理新分支首次提交的全0哈希场景
    if [[ "${{ github.event.before }}" == "0000000000000000000000000000000000000000" ]]; then
      VERSION_CHANGED=1
    else
      # 用|| true忽略git diff的非0退出码,确保脚本继续执行
      VERSION_CHANGED=$(git diff --name-only ${{ github.event.before }}..HEAD | grep -c '^src/manifest.json$' || true)
    fi
    echo "version_changed=$VERSION_CHANGED" >> "$GITHUB_OUTPUT"

方案3:使用现成Action简化逻辑

用tj-actions/changed-files替代自定义git命令,无需处理复杂的git场景:

- name: Check if manifest.json changed
  id: check_version
  uses: tj-actions/changed-files@v41
  with:
    files: src/manifest.json

后续可通过${{ steps.check_version.outputs.any_changed }}获取变更状态(true表示有变更,false表示无变更)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:01:08