技能setup-pre-commit
S

setup-pre-commit

在当前仓库中设置 Husky pre-commit 钩子,并配置 lint-staged(Prettier)、类型检查和测试。当用户希望添加 pre-commit 钩子、设置 Husky、配置 lint-staged,或添加提交时的格式化、类型检查和测试时使用。

Setup Pre-Commit - 一键配置 Husky 提交前检查钩子

技能概述

Setup Pre-Commit 为当前仓库自动配置 Husky pre-commit 钩子,集成 lint-staged 与 Prettier 格式化暂存文件,并在提交前运行类型检查和测试。

适用场景

  1. 团队协作统一代码风格:多人开发时每个人的编辑器和格式化习惯不同,用 pre-commit 钩子在提交环节自动跑 Prettier,只处理本次改动的暂存文件,不需要全量格式化历史代码,也不会有"格式化提交"污染提交记录。

  2. 老项目接入提交前检查:仓库里还没有任何 Git hooks,想一次性把格式化、类型检查、测试三道关卡加在 commit 之前,避免明显有问题的代码进入主干。

  3. TypeScript 项目防止类型错误入库:把 typechecktest 脚本挂到钩子上,提交前自动执行,比等到 CI 阶段才发现失败要早得多。

核心功能

  1. Husky 初始化与钩子创建:执行 npx husky init 创建 .husky/ 目录并写入 prepare: "husky" 脚本,然后生成 .husky/pre-commit 文件。Husky v9 及以上版本的钩子文件不需要 shebang。

  2. lint-staged + Prettier 格式化暂存文件:生成 .lintstagedrc 配置 "*": "prettier --ignore-unknown --write",只对本次 staged 的文件跑格式化。--ignore-unknown 会跳过 Prettier 无法解析的文件(图片等),避免报错中断提交。若仓库缺少 Prettier 配置,会补一份默认的 .prettierrc(2 空格缩进、80 列宽、双引号、ES5 尾逗号、带分号);已有配置则保持不动。

  3. 自动识别包管理器并适配命令:检测 package-lock.jsonpnpm-lock.yamlyarn.lockbun.lockb 判断使用 npm、pnpm、yarn 还是 bun,钩子里的命令会替换成对应的包管理器。若 package.json 里没有 typechecktest 脚本,会省略对应行并明确告知,而不是写进去等着报错。

常见问题

pre-commit 钩子会让每次提交变慢吗?

lint-staged 只对暂存区文件跑 Prettier,通常很快。真正耗时的是后面的完整 typechecktest,它们作用于整个项目。技能把 lint-staged 放在第一步,格式化和类型检查的报错能尽早暴露,但项目测试套件很大时提交等待会明显变长——这种情况下可以只保留格式化,把测试交给 CI。

项目里没有 typecheck 或 test 脚本怎么办?

技能会检查 package.json,缺失的脚本对应的行会直接从 .husky/pre-commit 中省略,并告知你少了哪一条。钩子不会因为引用了不存在的脚本而失败。需要的话可以先补上脚本再重新配置。

支持 pnpm、yarn、bun 吗?已有的 Prettier 配置会被覆盖吗?

支持。技能通过 lockfile 自动识别 npm、pnpm、yarn、bun,锁文件都没找到时默认用 npm,钩子内的命令会同步替换。Prettier 配置只在仓库完全没有时才会创建 .prettierrc,已有配置不会被覆盖。注意 .lintstagedrc.husky/pre-commit 属于技能直接写入的文件,如果仓库里已存在同名文件需要留意。

配好之后怎么确认真的生效?

按技能内的检查项逐条核对:.husky/pre-commit 存在且有可执行权限、.lintstagedrc 存在、package.json 的 prepare"husky"、Prettier 配置存在,并手动跑一次 npx lint-staged。最后技能会把改动提交一次,这次提交本身就会触发新钩子,相当于一次真实的冒烟测试。日常想临时跳过检查,可以用 git commit --no-verify