git cz报“cannot find module”错误本质是commitizen找不到配置的适配器模块,常见于未安装cz-conventional-changelog或cz-customizable、未加--save-dev、路径写错(如用相对路径)、或仅全局安装而项目缺少本地适配器。

Commitizen 不是用来“教你怎么写 commit”的,它是帮你绕过记忆负担和格式陷阱的提交生成器。装好、配对、用 git cz 替代 git commit,就能稳定输出符合 Conventional Commits 规范的提交信息——前提是路径、适配器、配置三者对得上。
为什么 git cz 执行后报错 “Cannot find module”
这是最常卡住人的第一步。错误本质是 Commitizen 找不到配置的适配器模块,常见于手动改了 package.json 但没装对应包,或路径写错。
-
cz-conventional-changelog必须显式安装,不能只靠commitizen init命令自动完成(某些 npm/yarn 版本会失败);执行npm install --save-dev cz-conventional-changelog补全 - 如果在
package.json里写了"path": "cz-customizable",但没装cz-customizable,或装了却没加--save-dev,就会报这个错 - 路径别写相对路径如
./node_modules/cz-conventional-changelog—— Commitizen 只认模块名或绝对路径,推荐直接写"cz-conventional-changelog" - 全局安装了
commitizen,但项目里没本地安装适配器,也会失败;Commitizen 总是优先查项目本地的node_modules
如何让团队成员不手写 git commit -m
靠文档提醒没用,得从工作流上堵死。核心是把 git cz 变成唯一入口,并让 git commit 直接失效。
- 在
package.json的scripts中加一行:"commit": "git cz",团队统一运行npm run commit - 配合 Husky + commit-msg 钩子,用
commitlint校验原始 commit message;这样即使有人绕过git cz直接git commit,也会被拦截 - 删掉所有
git commit的文档示例,README 里只写npm run commit;新成员 clone 项目后第一眼看到的就是正确姿势 - 注意:不要在 Husky 的 pre-commit 钩子里调用
git cz—— 它是交互式的,CI 环境下会卡住
cz-customizable 自定义配置时容易漏的关键项
用 cz-customizable 是为了控制字段顺序、跳过非必要步骤、限制长度,但几个配置项一旦漏掉,交互体验就倒退到“半自动”状态。
-
skipQuestions必须显式声明要跳过的项,比如["body", "footer"];不写它,每次都会问“详细描述”和“关联 issue”,新人容易乱填 -
subjectLimit默认是 50,但 Angular 规范实际建议 72;设太小会导致简短描述被截断,设太大又失去约束力,推荐固定为72 -
messages.type的文案最好带冒号,比如"请选择提交类型:",否则终端里提示不清晰 - 自定义
.cz-config.js后,package.json里的config.commitizen.path必须指向cz-customizable,而不是cz-conventional-changelog—— 两者不兼容
提交类型选 refactor 还是 chore?边界在哪
这不是语法问题,而是语义归类问题。选错类型不会让命令失败,但会影响后续自动生成 CHANGELOG 和 semantic release 的版本号计算。
-
refactor:代码逻辑没变,但结构/可读性/可维护性变了,比如函数拆分、变量重命名、移除重复逻辑;它不修复 bug,也不加功能 -
chore:跟源码逻辑完全无关的操作,比如升级依赖、调整 ESLint 规则、修改 CI 配置、清理node_modules - 一个典型混淆点:
把 var 改成 const属于refactor(影响作用域语义),而把 Prettier 配置从 2.x 升级到 3.x属于chore - 如果不确定,宁可选
chore—— 它不会触发 minor/major 版本升级,更安全
Commitizen 的价值不在“多了一个命令”,而在把模糊的协作共识(比如“提交要写清楚”)转化成不可绕过的交互路径。最难的部分不是配置,而是让所有人习惯在 git add 之后,手指自动去敲 git cz 而不是 git commit -m。











