发布于 2026-01-06 0 阅读
0

使用 Git 钩子实现自动化

使用 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命令中。

在我的“自动 lint”博客文章中,了解如何将Prettier集成到ESLint中。

如果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-staged1错误代码退出。
此错误导致lint-staged程序也失败并以1错误代码退出。

失败后,更改被还原,这意味着该段代码格式不正确!

lint-staged 失败导致提交停止

自动化

这为自动化应用提供了一个理想的案例。

通过结合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 检查字符串(不符合我们设定的规则)时的终端输出。

一个无法通过 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 上
告诉我

文章来源:https://dev.to/nickymeuleman/automation-with-git-hooks-112n