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

