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

Husky(v8)预提交配置问题:无法生成文件及启动失败

Husky配置问题及解决方法

问题背景

我在新项目中执行了以下操作:

  • 安装Husky开发依赖:npm install --save-dev husky
  • 执行初始化命令:npx husky init

根据Husky官方文档的预期,init命令应该简化配置,在.husky/目录创建pre-commit脚本并更新package.json的prepare脚本,但实际执行后控制台只输出帮助文本,未创建任何文件夹:

Usage:
  husky install [dir] (default: .husky)
  husky uninstall
  husky set|add <file> [cmd]

后续执行npx husky install,虽然生成了.husky文件夹(包含.gitignore和husky.sh),但没有创建pre-commit文件,再次执行npx husky init依然只输出帮助文本。

另外:

  • .git/hooks目录只有pre-commit.sample,无实际pre-commit文件
  • package.json中保留了旧配置:
    "lint-staged": {
      "src/**/*.{js,jsx,ts,tsx}": [
          "npm run tidy",
          "npm run test"
      ]
    },
    "scripts": {
      "pre-commit": "lint-staged"
    }
    
    但当前Husky文档未提及这些配置,不确定是否需要保留。

手动在.husky目录添加pre-commit文件,内容为npm run lint,执行时报错:

error: cannot spawn .husky/pre-commit: No such file or directory

解决步骤

1. 修复npx husky init无效问题

npx husky init无效大概率是Husky版本过低——v4及以下版本没有init命令,仅v5+版本支持。先检查当前版本:

npm list husky

如果版本低于v5,卸载后重装最新版:

npm uninstall husky --save-dev
npm install husky --save-dev

2. 正确初始化Husky

安装最新版后重新执行:

npx husky init

此时会自动完成:

  • 创建.husky目录及内置的pre-commit脚本
  • 在package.json中添加prepare脚本(用于自动启用Husky钩子)

3. 配置pre-commit关联lint-staged

无需保留package.json中的pre-commit脚本(这是旧版Husky的配置方式),直接用Husky命令添加钩子:

npx husky set .husky/pre-commit "npx lint-staged"

该命令会自动更新.husky/pre-commit文件的内容,替换默认测试命令。

4. 修复手动创建pre-commit的报错

手动创建文件报错是因为缺少可执行权限和必要的shebang头。正确的pre-commit文件内容应为:

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

npm run lint
# 若用lint-staged则替换为:npx lint-staged

然后给文件添加可执行权限:

chmod +x .husky/pre-commit

5. 验证配置有效性

执行提交测试:

git add .
git commit -m "test husky hook"

若钩子正常执行,说明配置成功。

额外说明

  • 旧版package.json中的pre-commit脚本可以删除,v5+的Husky不再依赖该配置
  • .git/hooks目录下的.sample文件无需改动,Husky会自动接管钩子逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:14:58