GitHub Action检测manifest变更时返回0却触发退出码1失败
问题原因
- 本地缺少目标提交:GitHub Actions默认使用浅克隆(仅拉取最新1次提交),
${{ github.event.before }}对应的历史提交不在本地仓库中,执行git diff时会因找不到提交而返回非0退出码。 - Bash严格模式触发中断:GitHub Actions的Bash默认启用
-e选项,脚本中任何命令返回非0都会立即终止步骤。当git diff失败时,即使后续逻辑能正常计算结果,脚本也会直接退出。 - 新分支提交的特殊场景:推送新分支时,
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
相关产品推荐
相关产品推荐

