Husky - 你一定需要的Git Hook 工具

Husky - 你一定需要的Git Hook 工具

前言

在团队开发协作中,Git作为不可或缺的利器,想必每个开发人员都已经对它的基本运用驾轻就熟了。然而,在实际的团队协作开发中,你是否曾经遇到过这样的问题:当你在本地执行拉取(pull)操作,获取到团队成员的代码时,却发现他们的代码并未经过格式化,或者存在一些语法错误,甚至遗漏了某个文件的提交。而此时,那位同事却恰好处于休假状态。你只能先着手解决这些报错问题,才能顺利地在本地运行代码。而如果你也修改了那些未经格式化的代码,并在推送(push)之后,同事休假回来,他们对代码进行了格式化处理,并添加了新的功能,当他们提交时,就会产生大量的冲突,而再去解决这些不必要的冲突,又需要消耗你大量的精力。所以规范git提交操作,在git提交时进行eslint静态代码检查,以及格式化代码,这是必要的。

安装husky

Git Husky 是一个 Git Hook 工具,它为 Git 客户端增加了钩子(hooks)功能,使得在特定阶段执行一系列流程,以保证每一个 commit 的正确性。Git Hook允许开发者在特定事件(如 commit、push)发生时触发自定义脚本。帮助开发者在代码审查、自动化测试等方面提高工作效率。

使用husky-init用于快速初始化husky项目。

npx husky-init && npm install

执行完这个命令,将自动化完成一些操作
1、它将prepare脚本添加到package.json
2、在项目根目录自动创建.husky文件夹,包含可编辑的pre-commit钩子

安装lint-staged

lint-staged可以在git staged阶段的文件上执行代码检查(Linters),包括ESLint和Stylelint等。简单说就是,当开发者运行ESlint或Stylelint命令时,可以通过设置指定只检查通过git add添加到暂存区的文件,避免每次检查都把整个项目的代码都检查一遍,从而提高效率。

1、执行此命令来安装lint-staged,执行后.husky/_文件夹下将自动生成husky.sh 脚本

npm i -D lint-staged

2、在package.json 中添加scripts

"pre-commit": "lint-staged"

3、新建 .lintstagedrc配置文件并添加以下命令

提交时执行prettier代码格式化,eslint检查修复

{
  "src/**/*.{ts,vue}": [
    "prettier --write",
    "eslint --fix"
  ]
}

4、修改.husky/pre-commit文件,使提交时能执行lint-staged钩子

npm run pre-commit

commit-msg

commitlint检查提交消息是否符合常规提交格式,用于在每次提交时生成符合规范的commit消息。

1、安装commit-msg

npm install --save-dev @commitlint/config-conventional @commitlint/cli

2、在项目根目录下添加commitlint.config.js配置文件,配置文件详细说明如下:

module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [ // type枚举
        2, 'always',
        [
          'build', // 编译相关的修改,例如发布版本、对项目构建或者依赖的改动
          'feat', // 新功能
          'fix', // 修补bug
          'docs', // 文档修改
          'style', // 代码格式修改, 注意不是 css 修改
          'refactor', // 重构
          'perf', // 优化相关,比如提升性能、体验
          'test', // 测试用例修改
          'revert', // 代码回滚
          'ci', // 持续集成修改
          'config', // 配置修改
          'chore', // 其他改动
        ],
    ],
    'type-empty': [2, 'never'], // never: type不能为空; always: type必须为空
    'type-case': [0, 'always', 'lower-case'], // type必须小写,upper-case大写,camel-case小驼峰,kebab-case短横线,pascal-case大驼峰,等等
    'scope-empty': [0],
    'scope-case': [0],
    'subject-empty': [2, 'never'], // subject不能为空
    'subject-case': [0],
    'subject-full-stop': [0, 'never', '.'], // subject以.为结束标记
    'header-max-length': [2, 'always', 72], // header最长72
    'body-leading-blank': [0], // body换行
    'footer-leading-blank': [0, 'always'], // footer以空行开头
  }
}

3、执行以下命令添加commitlint钩子

npx husky add .husky/commit-msg "npm run commitlint"

4、在package.json script中增加

"commitlint": "commitlint --config commitlint.config.js -e -V"

注意

按上面步骤修改完,我们在提交代码时候,如果随便写一个提交message将会报错,不允许提交,如下所示:

> commitlint --config commitlint.config.js -e -V

⧗   input: 测试
✖   subject may not be empty [subject-empty]
✖   type may not be empty [type-empty]

✖   found 2 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint

husky - commit-msg hook exited with code 1 (error)

如果我们修改提交语句,则能正确提交

git commit -m 'fix: 测试'

总结

在配置完成以上git hooks后,可以看到提交的代码都是被格式化,而且经过eslint检查,干净没有格式问题的代码,统一了团队代码格式规范。增加了整体代码质量,因此,觉得有用的小伙伴们快去给自己的项目中加上试试吧。

根据提供的引用内容,"husky - commit-msg hook exited with code 1 (error)" 是一个错误消息,它表示在执行 "commit-msg" 钩子时出现了错误。这通常是由于提交消息不符合预定义的规则或格式所导致的。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查提交消息的格式:首先,你需要确保你的提交消息符合预定义的规则和格式。通常,提交消息应该包含一个简短的描述和一个更详细的说明。你可以参考项目的提交消息指南或规范来了解正确的提交消息格式。 2. 检查 "commit-msg" 钩子脚本:"commit-msg" 钩子是一个自定义的脚本,用于在提交消息被保存之前进行验证或修改。你可以检查该钩子脚本是否存在错误或逻辑问题。确保脚本能够正确地执行验证并返回正确的退出代码。 3. 检查 husky 配置:husky 是一个用于管理 Git 钩子的工具。你可以检查 husky 的配置文件,确保 "commit-msg" 钩子被正确地配置和启用。如果配置有误,你可以尝试重新配置或更新 husky。 4. 检查 Git 配置:最后,你可以检查 Git 的全局或项目级配置,确保没有其他配置或钩子脚本与 "commit-msg" 钩子冲突或干扰。你可以使用 `git config --global --list` 命令来查看全局配置,使用 `git config --local --list` 命令来查看项目级配置。 如果以上步骤都没有解决问题,你可以尝试搜索相关错误消息或在项目的文档或社区中寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶落风尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值