使用 Git 钩子实现自动化
自动化只有在真正实现自动化时才能发挥其优势。
Git钩子允许你在特定触发事件发生时运行某些代码。
在Git生命周期的某些特定节点,会触发某个事件,并运行与该触发事件关联的代码。
我觉得它就像自动滑动门。
当传感器检测到你时,门就会打开。
例如:在使用git hook之前运行代码检查/格式化命令。git commitpre-commit
任何使用 Git 的项目都可以利用 Git 钩子。
这些钩子是位于该.git/hooks目录中的脚本。
默认情况下,这些文件是 bash 脚本,但唯一的要求是文件必须是可执行文件。
git 文档网站列出了所有可用的 git 钩子。
在没有任何工具的情况下与他人共享 Git hooks 非常麻烦。这个.git目录并不属于 Git 仓库的一部分,有点奇怪(真是讽刺)。
确保每个人都使用相同的 hooks 并且拥有运行它们所需的本地工具,很快就会变成一件苦差事。
沙哑
Husky是一款工具,它使在 JavaScript 项目中定义和共享 git hooks 变得非常方便。
安装
npm i husky -D
# or
yarn add husky -D
配置
安装完该工具后,.huskyrc.json在项目根目录下创建一个名为 `.config` 的文件。
该文件将保存该工具的配置信息。
package.json也可以在文件中提供该配置。
{
"hooks": {
"pre-commit": "npm test"
}
}
使用
pre-commit每次代码提交到(本地)代码库时,该钩子都会触发。只有当脚本(在本例中)无错误返回
时,提交才会成功。npm test
使用pre-commit副歌时,每次你做出承诺时,你都可以唱:
🎵 我正在考虑的是全力以赴。🎵
下图显示了尝试向新启动的 Gatsby 应用提交更改时的终端输出。运行的命令
以错误信息退出,表明发生错误。 此错误导致提交无法生效。testpre-commit1
棉絮状的
该lint-staged工具允许您执行脚本,并将暂存文件列表作为参数传递。
不要被名称中的“lint”(棉絮)一词所迷惑。虽然棉絮清理是该软件包非常常见的用途,但这绝不是唯一的用途!
安装
npm i lint-staged -D
# or
yarn add lint-staged -D
配置
安装完该工具后,.lintstagedrc.json在项目根目录下创建一个名为 `.config` 的文件。
该文件将保存该工具的配置信息。
package.json也可以在文件中提供该配置。
文档原文:
配置应该是一个对象,其中每个值都是要运行的命令,其键是该命令要使用的 glob 模式。此软件包使用micromatch来处理 glob 模式。
{
"*.{js,jsx}": "eslint --fix"
}
上述配置会将每个以.js或结尾的暂存文件.jsx作为参数添加到eslint --fix命令中。
如果iLikeTurtles.js更改Boop.jsx、保存并git add编辑,则会产生以下命令:eslint --fix iLikeTurtles.js Boop.jsx。
该命令成功完成后,(可能已更改的)文件将git add再次被编辑。
使用
npx lint-staged
# or
yarn lint-staged
例如,下面是一段(格式糟糕的)代码,该代码在运行之前已添加到 git 中lint-staged。
var num=1
var newNum=num+5;;
该eslint --fix命令在执行过程中lint-staged以1错误代码退出。
此错误导致lint-staged程序也失败并以1错误代码退出。
失败后,更改被还原,这意味着该段代码格式不正确!
自动化
这为自动化应用提供了一个理想的案例。
通过结合husky和lint-staged,
可以在提交之前执行一段代码,该代码旨在对每个暂存文件运行(例如eslint)。
这可以通过编辑.huskyrc.json以在触发器lint-staged上执行来实现pre-commit。
lint-staged只有当脚本(在本例中)没有返回错误时,提交才会成功。
{
"hooks": {
"pre-commit": "lint-staged"
}
}
这种设置只会检查即将提交的文件,从而节省时间,因为检查整个项目可能需要很长时间。
Commitlint
该commitlint工具允许您执行一个脚本,该脚本会检查字符串并对其应用一些规则。
顾名思义,该工具通常用于检查提交信息。
该工具可用于强制提交信息符合标准的规范。通常
建议提交信息的标题包含“为什么?”,正文包含“做什么?”。至于“怎么做?”的答案,可以通过查看已提交的代码来找到。
除了提高清晰度之外,使用一致的提交信息格式还有 许多 好处。
安装
npm i @commitlint/config-conventional @commitlint/cli -D
# or
yarn add @commitlint/config-conventional @commitlint/cli -D
配置
安装完该工具后,.commitlintrc.json在项目根目录下创建一个名为 `.config` 的文件。
该文件将保存该工具的配置信息。
package.json也可以在文件中提供该配置。
与ESLint(JavaScript 代码检查工具)类似,commitlint 可以进行广泛的配置。
{
"extends": ["@commitlint/config-conventional"]
}
上述配置会将@commitlint/config-conventional中设置的规则应用于 commitlint 检查的每个提交消息。
使用/测试
可以通过管道将消息传递给以下函数来测试消息的输出commitlint:
echo '<your-commit-message>' | npx commitlint
# or
echo '<your-commit-message>' | yarn commitlint
下图显示了使用 commitlint 检查字符串(不符合我们设定的规则)时的终端输出。
自动化
对提交信息进行代码检查是使用 Git 钩子进行自动化的另一个理想用例。
通过结合使用husky和commitlint,
可以在提交之前检查附加的提交信息。
这可以通过编辑.huskyrc.json以在触发器commitlint上执行来实现commit-msg。
{
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
commitlint只有当脚本(在本例中)没有返回错误时,提交才会成功。
CLI 提示工具
虽然可以手动编写符合规则的提交信息,但如果能有方法指导你编写提交信息,那就非常有用。
commitlint CLI 提示符有助于快速编写提交信息,并确保它们遵循这些规则。
安装
npm i @commitlint/prompt-cli -D
# or
yarn add @commitlint/prompt-cli -D
使用
npx commit
# or
yarn commit
为了方便使用,请将此命令添加到"scripts"存储库的键中。package.json
{
"scripts": {
"commit": "commit"
}
}
现在可以通过执行该脚本将代码提交到代码库。
该脚本将引导您通过以下步骤在交互式命令行界面 (CLI) 中完成操作:
- 类型
- (可选)范围
- 主题
- (可选)正文
- (可选)页脚
每一步都会显示距离达到最大长度(规则中设置)还剩下多少字符。
如果输入 `\n` help,则会列出该步骤的可用命令(如果适用)。
例如,help在输入步骤中输入内容会显示可供选择的正确类型(杂务、任务、修理……)。
任何可选步骤都可以通过输入内容来跳过:skip。
commitlint 提示符的替代方案是commitizen。
结论
Git钩子是自动化工作流程和强制执行代码规范的有效方法。
所有Git仓库(无论使用何种语言编写)都可以使用它们。
以 JavaScript 项目为例,husky包提供了一种便捷的方式,可以与克隆该存储库的每个人共享特定的 hooks 设置。
代码检查和格式化标准是通过使用lint-staged来强制执行的。
通过使用commitlint检查消息来强制执行提交消息标准。
有没有什么方法可以进一步自动化工作流程(使用 Git 钩子)?请在 Twitter 上
告诉我!


