git hook 是什么?
git hook 是git生命周期中的一些钩子,将在特定的 Git 命令执行前或执行后运行脚本,开发人员能够在 Git 操作过程中自动执行特定的自定义代码。
- pre-commit 钩子:将在执行提交之前运行,可以用来确保代码符合特定格式、运行测试、检查代码质量等。
- post-commit 钩子:将在执行提交之后运行,可以用来执行某些特定操作,例如将提交信息发送给团队成员等。
- pre-push 钩子:将在执行推送命令之前运行,可以用来确保代码通过检查点测试、代码质量检查和其他合规性检查等。
为什么要使用 git hook?
git hook可以在我们提交代码的时候,自动触发一些命令,如eslint检测等,避免误操作和不规范的代码提交。以下是git pre-commit的一个示例:
- 当执行 git commit 命令时,会自动执行 .git/hooks/pre-commit 文件
git hook 有什么不足?
git hook问题由于在提交代码时,.git
文件夹不会被包含在提交的代码中。所以在多人协作开发的时候,无法同步git hook文件
如何解决 git hook文件 无法同步的问题?
使用 husky ,husky会创建一个.husky文件夹,可以上传到git仓库。
npm add husky -D //安装husky
npx husky install //初始化操作
package.json
{ "scripts": { // 会在安装 npm 依赖后自动执行 "prepare": "husky install" } }
然后添加 Husky 钩子,在终端执行如下命令:
npx husky add .husky/pre-commit "npm run lint"
此时会生成 .husky文件夹和pre-commit文件
当执行 git commit 时 会自动触发 ./husky/pre-commit 文件中的命令
pretty-quick
pretty-quick 会在代码提交的时候, 对暂存文件格式化,并且它们将在格式化后重新暂存。
安装依赖
npm install prettier pretty-quick --save-dev
package.json
"precommit": "pretty-quick --staged"
修改.husky/pre-commit文件
当执行git commit时 会触发 npm run precommit。即pretty-quick --staged,代码会自动格式化,从而实现团队统一代码风格。
Commitizen + husky规范提交信息
git提交信息应该包括明确的清晰明了,有分类。
// 安装 commitizen npm i commitizen -g // 使用 git cz 命令 git cz
使用 git cz
代替 git commit
,出现以下commit选项
自定义团队提交规范
-
使用命令
npm cz-customizable --save-dev
安装 -
在
package.json
中新增
"config": { "commitizen": { "path":"node_modules/cz-customizable" } }
3. 在根目录中创建 .cz-config.js
文件
'use strict';
module.exports = {
types: \[
{ value: '✨特性', name: '特性: 一个新的特性' },
{ value: '🐛修复', name: '修复: 修复一个Bug' },
{ value: '📝文档', name: '文档: 变更的只有文档' },
{ value: '💄格式', name: '格式: 空格, 分号等格式修复' },
{ value: '♻️重构', name: '重构: 代码重构,注意和特性、修复区分开' },
{ value: '⚡️性能', name: '性能: 提升性能' },
{ value: '✅测试', name: '测试: 添加一个测试' },
{ value: '🔧工具', name: '工具: 开发工具变动(构建、脚手架工具等)' },
{ value: '⏪回滚', name: '回滚: 代码回退' }],
messages: {
type: '请选择提交的类型;',
customScope: '请输入修改的范围(可选)',
subject: '请简要描述提交(必填)',
body: '请输入详细描述(可选)',
footer: '请选择要关闭的issue(可选)',
confirmCommit: '确认要使用以上信息提交?(y/n)'
},
// limit subject length
subjectLimit: 100
};