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

如何在pre-commit钩子中使用git diff退出码判断前端文件变更

问题原因

Husky加载的husky.sh默认开启了set -e(命令返回非0立即终止脚本)配置。你使用的git diff --cached --quiet frontend命令,在检测到存在暂存的frontend目录变更时,会返回退出码1,这个非0退出码会被set -e直接捕获,还没走到后续的if [ $? -eq 1 ]判断逻辑,脚本就被终止了,因此抛出了pre-commit退出码1的错误。

修复方案

直接把git diff命令放到if判断条件里即可,if结构内的命令返回非0不会触发set -e的终止逻辑,修复后的完整脚本如下:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

if git diff --cached --name-only --quiet frontend; then
  # 无frontend目录变更,跳过校验
  exit 0
else
  # 存在frontend目录变更,执行lint校验
  cd frontend && npm run lint
fi
补充说明

如果想保留原来基于$?判断的写法,也可以在git diff命令末尾加|| :吃掉非0退出码,避免触发脚本终止,示例如下:

git diff --cached --name-only --quiet frontend || :
if [ $? -eq 1 ]; then
  cd frontend && npm run lint
fi

注意如果npm run lint执行失败返回非0退出码,脚本会正常终止提交,这属于预期行为,可保证提交的前端代码都符合lint规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:06:02