Codex Husky钩子最佳实践:Mac Git提交前自动Lint检查
要想在Mac的Codex项目中,每次执行git commit前自动触发ESLint检查,Husky几乎是必备工具。但实际配置中容易踩坑——需要正确初始化Husky、搭配lint-staged、配置pre-commit钩子,还得处理Mac特有的权限问题、Shell兼容性以及nvm环境差异。下面把完整流程拆解开,每一步都附带容易忽略的实操细节。
简单说就是:每次git commit前自动校验代码规范,杜绝不合规的代码进入仓库。要做到这一点,关键在于让Husky成功加载并触发lint-staged的执行流程。
初始化Husky并启用钩子目录
打开终端,进入项目根目录,安装Husky:
npm install husky --save-dev
接着运行初始化命令:
npx husky init
这步会在项目根目录生成.husky文件夹,并自动向package.json添加prepare脚本。如果未自动生成,手动补一条:
npm set-script prepare "husky install"
切记一定要执行 npm run prepare——只有这一步才能真正激活钩子。否则.husky/pre-commit这些脚本Git根本不会识别,等于白做。
配置pre-commit钩子执行lint-staged
确保已经安装lint-staged:
npm install lint-staged --save-dev
然后在package.json中添加lint-staged配置(非强制但强烈建议):
"lint-staged": { "src/**/*.{js,jsx,ts,tsx}": ["eslint --fix", "git add"] }
接下来创建pre-commit钩子:
npx husky add .husky/pre-commit "npx lint-staged"
此时.husky/pre-commit文件内容应是一段可执行的shell脚本:首行为#!/bin/sh,第二行为. "$(dirname "$0")/_/husky.sh"。如果缺少第二行,务必手动补上——否则在Mac系统下钩子很可能静默失效,连错误提示都没有。
验证Husky是否生效
配置完成后需要验证,这里有三种方法:
方法一:手动触发测试
修改一个JS文件,故意引入ESLint违规(比如删掉分号),然后执行:
git add . && git commit -m "test lint"
方法二:检查钩子是否注册成功
直接查看文件内容:
cat .husky/pre-commit
如果输出包含npx lint-staged,说明钩子已写入。
方法三:查看Git当前激活的钩子路径
执行:
git config --list | grep hook
如果输出显示core.hooksPath=.husky,表明Husky已完全接管Git的钩子系统。
解决Mac常见权限问题
Mac上跑Husky,最常见的翻车现场就是权限和Shell兼容性。三步搞定:
第一步:给钩子文件添加执行权限
chmod +x .husky/pre-commit
第二步:确认Shell环境兼容
Mac默认使用zsh,但部分旧版Husky生成的脚本以#!/bin/sh开头。若遇到/bin/sh: npx: command not found错误,将.husky/pre-commit第一行改成#!/bin/zsh即可。
第三步:绕过Node版本冲突(仅当使用nvm时)
如果通过nvm管理Node版本,钩子脚本可能找不到node或npx。解决办法是在.husky/pre-commit顶部插入以下两行,加载nvm环境:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
这样Husky就能在正确的Node版本下顺利运行lint-staged了。