Git Hooks 和 自动生成 Commit Message

前言:
企业编程必须始终依赖流程,而不是个人。个人能力很重要,应该鼓励,但不能指望它,否则软件质量将不一致,没有可持续性。一旦顶级程序员跳槽,公司就会陷入困境。企业应该努力改进工作流程,而不是努力改进人员,始终坚持流程优先于人员。

Git hooks

  在团队协作开发中,代码规范的一致性和提交质量至关重要。Git Hook 是 Git 版本控制系统提供的强大机制,它允许开发者在特定 Git 事件(如提交代码、推送变更等)发生时触发自定义脚本。这些钩子脚本就像代码世界的自动哨兵,能在关键时刻执行预设的质量检查。

常见的 Hook 类型

钩子类型触发时机典型应用场景
pre-commit提交消息输入前代码风格检查,单元测试
commit-msg提交消息保存时校验提交信息格式
pre-push推送到远程仓库前集成测试,构建验证
post-merge合并操作完成后依赖安装,环境配置

Git Hook 默认存储在 .git/hooks 目录中,

在这里插入图片描述

Husky

   Git Hook 都是使用 shell 脚本实现的,对不不熟悉 shell 脚本的人来说不太容易,同时shell 脚本再 Win/Linux/Mac 不同平台存在差异需要手动处理。所以需要借助 Husky 这个工具来简化 Git Hooks。

特性Git HooksHusky
存储位置.git/hooks(不随代码提交).husky(提交到版本库)
团队共享需要手动复制到每个开发者的环境自动随代码同步,无需额外配置
跨平台支持需要手动处理不同系统的差异自动处理 Windows/macOS/Linux 差异
脚本管理需手动编写和维护提供命令行工具简化创建和修改
错误处理需自行实现内置友好的错误提示和处理逻辑
集成手动实现无缝对接 ESLint、Prettier 等工具链
Husky 的原理

  Husky 的原理也很简单,就是复写了 Git Hook 部分的 Shell 脚本,依次调用 再 Husky 中配置的 npm scripts 将执行结果返回给 Git。

执行举例:

当 Git 触发某个 Hook(如 git commit 触发 pre-commit)时:

  1. Git 会查找并执行 .husky 目录下对应的脚本
  2. 脚本首先加载 husky.sh 以初始化环境
  3. 执行用户定义的命令(如 npm run lint)
  4. 根据命令的退出码决定是否继续执行:
    4.1退出码 0:成功,Git 继续执行后续操作
    4.2 非零退出码:失败,Git 终止当前操作(如阻止提交)
Husky 初始化
# 安装 Husky
npm install husky --save-dev

# 初始化Husky   同时会自动插入 "prepare": "husky", 到package.json
npx husky init

v8.0 之前的 Husky 使用 npx husky install 来初始化Husky,V8版本弃用。npx husky init 初始化 husky.
所以当使用 npx husky install 命令的时候会报错 husky - install command is DEPRECATED
为什么 husky install 被弃用?
在 Husky 8.x+ 版本中,开发者移除了手动初始化命令,转而通过 npm 生命周期脚本 自动管理钩子。官方认为:

  1. 手动初始化容易遗漏(尤其在新成员加入项目时)
  2. 自动初始化更符合现代 Node.js 项目规范
添加新的 hook

执行 echo "npm lint" > .husky/pre-commit 命令,将npm lint 命令添加到 pre-commit ,每次 commit 之前就会执行 npm lint 只要 npm lint 返回非 0,就会阻断提交。

// package.json
{
  "scripts": {
  		"lint": "eslint . --fix",
	}
}

Lint-staged

  每次提交前会执行代码检查,如果项目文件特别多,每次提交时都会花费相当多的时间,所以就有了 lint-stage .它会根据配置使用对应的代码检查工具校验 stage 的文件,而不是所有的文件。也就是只检查变化了的文件。

安装 lint-staged

npm install --save-dev lint-staged # requires further setup

配置 lint-staged

{
....
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix"
    ],
    "*.{json,md,yaml,yml}": [
      "prettier --write"
    ]
 ....
 }

自动生成 Commit Message

  每次提交都要填写 Commit Message 以方便其它人了解其中的改动,改动较多或者复杂的时候,写起来比较麻烦。最新版的 VS Code 已经支持通过 Copilot 来辅助生成 Commit Message,安装 Github Copilot 插件并登录之后,点击 源码管理 面板的 Commit Message 输入框后方的Copilot 图标即可自动生成 Commit Message

在这里插入图片描述

  Copilot 默认生成的 Commit Message 只有一段描述,有时候中英文还不一定。为了生成一份标准格式的 Commit Message 我们可以通过配置文件,告诉 Copilot 应该生成一份什么样的 Commit Message。在 VS Code 的配置文件中添加如下配置:

  {
  ...
  	"github.copilot.chat.commitMessageGeneration.instructions": [
    	{
      		"file": ".vscode/.copilot-commit-message-instructions.md"
    	}
  	]
  	...
  }

  然后再根据 file 指定的位置添加对应的 md 文件。 文件内容就是对要生成的 Commit Message 的要求,可以让 Copilot 或者 DeepSeek 辅助生成一份

在这里插入图片描述
然后再点击生成按钮,就可以生成符合标准的 Commit Message 了。

在这里插入图片描述

commitlint

commitlint 是用来校验 Commit Message 是否符合标准的,就不讲了,Copilot 生成的一般都是符合标准的 LOL。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值