关于 Commitizen
Commitizen 通过交互式命令行提示引导开发者创建符合 Conventional Commits 规范的提交信息。它确保整个团队的提交格式一致,便于后续的自动化工具处理和日志生成。
主要功能
- 01使用交互式提示创建结构化提交信息
- 02初始化项目并配置 Conventional Commits 规范
- 03强制执行一致的提交消息格式
- 04支持通过 git cz 命令替代标准 git commit
适用场景
- 01确保团队遵循统一的提交消息规范
- 02为自动化变更日志和版本管理提供结构化数据
- 03在代码审查中减少提交消息格式不一致的问题
安装
选择你的系统或包管理器,复制命令到终端运行。
安装完成后运行cz --version确认安装成功。
命令示例
常用命令按使用顺序排列。
详细介绍
供贡献者使用的 Commitizen
使用 Commitizen 提交时,系统会在提交时提示你填写所有必填的提交字段。无需再等到稍后由 git 提交钩子运行并拒绝你的提交(不过,那个钩子仍可能有所帮助)。无需再翻阅 CONTRIBUTING.md 来查找首选格式。即时获取提交消息格式的反馈,并按提示填写必填字段。
安装命令行工具
Commitizen 目前已针对 Node.js 12、14 和 16 进行测试,不过在较旧版本的 Node.js 中也可能正常运行。你还需要安装 npm 6 或更高版本。
安装非常简单,只需运行以下命令即可(如果看到 EACCES 错误,阅读修复 npm 权限问题或许会有帮助):
npm install -g commitizen
使用命令行工具
如果你的仓库兼容 Commitizen:
提交时,只需使用 git cz 或 cz 代替 git commit。你也可以使用 git-cz,它是 cz 的别名。
或者,如果你使用 npm 5.2+,可以使用 npx,而无需全局安装:
npx cz
也可以将其用作 npm 脚本:
...
"scripts": {
"commit": "cz"
}
在兼容 Commitizen 的仓库中工作时,系统会提示你填写所有必填字段,并根据项目维护者定义的规范格式化提交消息。
如果你的仓库不兼容 Commitizen:
如果你在不兼容 Commitizen 的仓库中工作,那么 git cz 的效果与 git commit 完全相同,但 npx cz 会使用 streamich/git-cz 适配器。要解决此问题,你需要先让仓库兼容 Commitizen
让你的仓库支持 Commitizen
在本示例中,我们将设置仓库,以使用 AngularJS 的提交消息约定,也称为 conventional-changelog。
首先,安装 Commitizen CLI 工具:
npm install commitizen -g
接下来,输入以下命令,初始化项目以使用 cz-conventional-changelog 适配器:
# npm
commitizen init cz-conventional-changelog --save-dev --save-exact
# yarn
commitizen init cz-conventional-changelog --yarn --dev --exact
# pnpm
commitizen init cz-conventional-changelog --pnpm --save-dev --save-exact
请注意,如果你想强制覆盖旧适配器进行安装,可以添加 --force 参数。有关详情,请运行 commitizen help。
以上命令会为你完成以下三件事:
- 安装 cz-conventional-changelog 适配器 npm 模块
- 将其保存到
package.json的dependencies或devDependencies中 - 在
package.json文件的根目录中添加config.commitizen键,如下所示:
...
"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
}
或者,也可以将 Commitizen 配置添加到 .czrc 文件中:
{
"path": "cz-conventional-changelog"
}
这只是在告诉 Commitizen,当贡献者尝试向此仓库提交代码时,我们希望他们使用哪个适配器。
commitizen.path 通过 require.resolve 解析,并支持:
- npm 模块
- 相对于
process.cwd()且包含index.js文件的目录 - 相对于
process.cwd()且带有.js扩展名的文件基本名称 - 完整的相对文件名
- 绝对路径
请注意,在以前版本的 Commitizen 中,我们使用的是 czConfig。czConfig 已弃用,你应在 Commitizen 3.0.0 发布前迁移到新格式。
可选:在本地安装并运行 Commitizen
在本地安装并运行 Commitizen,可以确保开发者在每台机器上运行的都是完全相同版本的 Commitizen。
使用 npm install --save-dev commitizen 安装 Commitizen。
在 npm 5.2+ 中,你可以 使用 npx 初始化 conventional changelog 适配器:
npx commitizen init cz-conventional-changelog --save-dev --save-exact
对于 较早版本的 npm(< 5.2),你可以执行 ./node_modules/.bin/commitizen 或 ./node_modules/.bin/cz 来使用这些命令。
然后,你可以使用以下命令初始化 conventional changelog 适配器:./node_modules/.bin/commitizen init cz-conventional-changelog --save-dev --save-exact
接着,你可以在 package.json 文件中添加一些方便的 npm 脚本,指向本地版本的 Commitizen:
...
"scripts": {
"commit": "cz"
}
这样对用户来说会更方便,因为他们想要提交代码时,只需运行 npm run commit,就会看到开始提交所需的提示!
注意: 如果你使用了类似
husky的工具设置precommit钩子,就需要将脚本命名为"commit"以外的名称 (例如,"cm": "cz")。这是因为 npm 脚本有一项“特性”:它会自动运行名称为 prexxx 的脚本,其中 xxx 是另一个脚本的名称。也就是说, 如果你将脚本命名为"commit",npm 和 husky 就会运行两次"precommit"脚本。解决方法是避免运行由 npm 触发的 precommit 脚本。
可选:在 git commit 时运行 Commitizen
本示例展示了如何通过使用 git 钩子和 --hook 命令行选项,将 Commitizen 集成到现有的 git commit 工作流中。这对于希望确保不熟悉 Commitizen 的贡献者也能遵循正确提交格式的项目维护者很有用。
实现上述任一方法后,运行 git commit 的用户都会看到一个交互式 Commitizen 会话,帮助他们编写有用的提交消息。
注意: 本示例假设项目已设置为在本地使用 Commitizen。
传统 Git 钩子
使用以下代码更新 .git/hooks/prepare-commit-msg:
#!/bin/bash
exec < /dev/tty && node_modules/.bin/cz --hook || true
Husky
对于 husky 用户,请将以下配置添加到项目的 package.json 文件中:
"husky": {
"hooks": {
"prepare-commit-msg": "exec < /dev/tty && npx cz --hook || true"
}
}
为什么使用
exec < /dev/tty? 默认情况下,Git 钩子不可交互。此命令允许用户在钩子运行期间使用终端与 Commitizen 交互。
恭喜!你的仓库已支持 Commitizen。是时候展示出来了!
使用以下 Markdown 将“支持 Commitizen”徽章添加到 README:
[](http://commitizen.github.io/cz-cli/)
你的徽章将如下所示:
你也可以考虑修改 README.md 或 CONTRIBUTING.md 文件,以介绍或链接到 Commitizen 项目,让新的贡献者了解如何安装和使用 Commitizen。
将规范提交消息用作全局工具
如果尚未全局安装 commitizen,请先安装。
npm install -g commitizen
全局安装你首选的 commitizen 适配器(例如 cz-conventional-changelog)。
npm install -g cz-conventional-changelog
在你的 home 目录中创建 .czrc 文件,其中的 path 指向首选的全局安装 commitizen 适配器
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
一切就绪!现在,进入任意 git 仓库,并使用 git cz 代替 git commit,即可看到 commitizen 提示。
专业提示:你可以将所有 git commit options 与 git cz 一起使用。例如:git cz -a。
如果你的仓库是 Node.js 项目,让它支持 Commitizen非常简单。
如果你的仓库已经支持 Commitizen,则会使用本地的 commitizen 适配器,而不是全局安装的适配器。
在多仓库项目中使用 Commitizen
如果你是多个项目的维护者,可能会希望为所有项目采用统一的提交消息格式。你可以创建自己的 node 模块,作为 Commitizen 的前端。
1. 创建自己的入口脚本
// my-cli.js
#!/usr/bin/env node
"use strict";
const path = require('path');
const bootstrap = require('commitizen/dist/cli/git-cz').bootstrap;
bootstrap({
cliPath: path.join(__dirname, '../../node_modules/commitizen'),
// this is new
config: {
"path": "cz-conventional-changelog"
}
});
2. 将脚本添加到你的 package.json 文件中
// package.json
{
"name": "company-commit",
"bin": "./my-cli.js",
"dependencies": {
"commitizen": "^2.7.6",
"cz-conventional-changelog": "^1.1.5"
}
}
3. 发布到 npm 并使用它!
npm install --save-dev company-commit
./node_modules/.bin/company-commit
适配器
我们知道每个项目和构建流程都有不同的要求,因此我们尽量让 Commitizen 易于扩展。你可以选择任意预构建的适配器,也可以自行构建。以下是一些可供使用的优秀适配器:
- cz-conventional-changelog
- cz-conventional-changelog-for-jira
- cz-conventional-changelog-with-jiraid-detection
- cz-jira-smart-commit
- @endemolshinegroup/cz-jira-smart-commit
- @endemolshinegroup/cz-github
- rb-conventional-changelog
- @mapbox/cz-mapbox-changelog
- cz-customizable
- cz-commitlint
- commitlint
- vscode-commitizen
- cz-emoji
- cz-adapter-eslint
- commitiquette
- cz-format-extension
- cz-emoji-conventional
- cz-git
- cz-vinyl
要创建适配器,只需 fork 这些优秀适配器之一,并根据你的需求进行修改。我们会向你传入一个 Inquirer.js 实例,但你可以通过任何必要的方式获取输入。只需使用字符串调用 commit 回调,我们就会处理好一切。将它发布到 npm,你就大功告成了!
重试失败的提交
从 2.7.1 版开始,你可以使用 git cz --retry 命令尝试重试上一次提交。如果你设置了通过 git precommit 钩子运行的测试,这会很有帮助。在这种情况下,你可能尝试使用 Commitizen 提交,费心填写了所有 Commitizen 字段,但测试却失败了。在之前的 Commitizen 版本中,修复测试后,你必须重新填写所有字段。现在可以使用重试命令了。Commitizen 会重试你在此仓库中尝试进行的上一次提交,无需你再次填写字段。
请注意,升级 Commitizen 版本、升级适配器,或删除主目录或临时目录中的 commitizen.json 文件时,重试缓存可能会被清除。此外,提交缓存使用仓库的文件系统路径,因此如果你移动仓库或更改其路径,就无法重试提交。这属于边缘情况,但如果你会移动包含仓库的文件夹,可能会因此感到困惑。
需要注意的是,如果你通过 npm 脚本运行 cz(假设脚本名为 commit),则需要执行以下操作之一:
- 将
-- --retry作为参数传递给脚本。例如:npm run commit -- --retry - 使用 npx 查找并直接调用
cz可执行文件。例如:npx cz --retry
请注意,后两种选项不需要在参数前传递 --,但第一种需要。
面向项目维护者的 Commitizen
作为项目维护者,让你的仓库兼容 Commitizen,就可以选择现有的提交消息约定,也可以创建自己的自定义提交消息约定。当仓库的贡献者使用 Commitizen 时,系统会在提交时提示他们填写正确的字段。
更进一步
Commitizen 本身就很出色,但与其他优秀的开源工具搭配使用时,它更能大放异彩。Kent C. Dodds 在他的 Egghead.io 系列课程 如何编写开源 JavaScript 库中,向你展示如何实现这一点。其中许多理念也适用于非 JavaScript 项目。
理念
关于 Commitizen
Commitizen 是一个开源项目,旨在帮助贡献者成为优秀的开源社区成员。它会在提交时提示贡献者遵循提交消息约定,从而实现这一目标。它还帮助项目维护者在仓库中创建或使用预定义的提交消息约定,以便更好地向潜在贡献者传达预期。
Commitizen 还是提交钩子
两者都要!Commitizen 并非要取代 git 提交钩子,而是要与它们协同工作,确保贡献者拥有一致且积极的体验。Commitizen 将提交命令视为一种声明式操作。贡献者声明自己希望为你的项目做出贡献。作为维护者,你需要定义他们应遵循的规则。
我们通过让你定义要在项目中使用的适配器来实现这一点。适配器只是让多个项目能够共享相同的提交消息约定。适配器的一个优秀示例是 cz-conventional-changelog 适配器。
相关项目
- conventional-changelog – 根据规范提交历史生成变更日志
- commitlint - 检查提交消息
作者和贡献者
@JimTheDev(Jim Cummins,作者) @kentcdodds @accraze @kytwb @Den-dp
特别感谢 @stevelacy,他的 gulp-git 项目让 commitizen 成为可能。
贡献者
本项目的存在离不开所有贡献者。[参与贡献]。
支持者
感谢所有支持者!🙏 [成为支持者]
赞助商
成为赞助商,支持这个项目。您的徽标将显示在此处,并链接到您的网站。[成为赞助商]
