Bash单行实现匹配输出true、GITHUB_ENV写入及Git错误解决
解决检测package.json变更并设置GitHub环境变量的问题
问题描述
原使用命令:
echo "PACKAGE_CHANGED=$(git diff --name-only abcabc abcabd | grep -Fqx package.json && echo \"true\")" >> "$GITHUB_ENV"
期望实现:当package.json有变更时,向$GITHUB_ENV写入PACKAGE_CHANGED=true;无变更时要么写入PACKAGE_CHANGED=,要么不执行写入。但遇到两个问题:
- 无变更时出现
Error: Process completed with exit code 1错误 - 修改
package.json版本后出现fatal: bad object ...错误
修正后的命令
方案1:无变更时写入空值
echo "PACKAGE_CHANGED=$(git diff --name-only abcabc abcabd | grep -Fqx package.json && echo "true" || echo "")" >> "$GITHUB_ENV"
方案2:无变更时不写入任何内容
git diff --name-only abcabc abcabd | grep -Fqx package.json && echo "PACKAGE_CHANGED=true" >> "$GITHUB_ENV"
问题解决说明
退出码错误修复:
原命令中,当grep未匹配到package.json时会返回非0退出码,触发GitHub Actions的步骤错误。方案1通过|| echo ""确保无论grep结果如何,最终命令都返回0退出码;方案2利用短路逻辑,仅在grep匹配成功时执行写入操作,从根源避免无变更时的错误。bad object错误修复:
该错误是因为指定的提交哈希在当前仓库中不存在(GitHub Actions默认浅克隆仓库,未拉取完整历史)。解决方式:- 执行命令前添加步骤拉取完整历史:
git fetch --unshallow - 改用分支名替代提交哈希(比如比较当前分支与main分支:
git diff --name-only main HEAD),避免使用不存在的哈希值。
- 执行命令前添加步骤拉取完整历史:
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

