Git hooks & Conventional commits

Git Hooks

是什么?

Hooks是提前定义的脚本程序,它们可以在git命令执行的特定时刻被触发。它是git的内置功能,在本地运行。

常用的hook有:

  • pre-commit
  • prepare-commit-msg
  • commit-msg
  • post-commit
  • post-merge
  • pre-push

实际应用中,你可能需要这样的自动化配置来解放生产力,比如:

  • 提交之前配合eslint进行代码规范检查、配合prettier进行代码格式化、进行单元测试。
  • 为了维护清晰的提交记录,检查git提交是否符合Conventional Commits提交规范。
  • 拉取远程仓库后,可能有人添加新的依赖,使用hook可以配置在拉取之后自动安装依赖。

怎么工作?

每个git仓库都有一个hooks的文件夹,默认为.git/hooks,在特定git命令执行时被触发调用。hook脚本以非零状态码退出(exit 1)时,会终止该git命令执行。

如何实现?

只需要在.git/hooks中重写(或创建)脚本即可。然而,实际开发中通常不会这样做,而是使用工具,例如husky

husky

本文使用husky v6,使用v4版本以下有不同的使用方法。

安装:

yarn add -D husky

添加下面npm scripts:

"scripts": {
    "test": "echo testing...",
    "prepare": "husky install"
}

运行yarn prepare,会在项目下创建一个文件夹,同时在.git/confg文件中添加了这样一行代码hooksPath = .husky,告诉git将hooks路径改为.husky

image-20210511230120523.png

接着,你就可以执行husky add <file> [cmd]创建钩子,例如:

# 如果没有相应钩子文件,会创建
yarn husky add .husky/pre-commit "echo 提交之前执行npm test命令"
# 已有钩子文件,会将[cmd]添加到钩子文件末尾
yarn husky add .husky/pre-commit "npm test"

生成.husky/pre-commit如下:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

echo 提交之前执行npm test命令
yarn test

执行提交命令测试git commit -m "test",执行结果见下图:

image-20210511233531616.png

如果你使用monorepo的项目管理模式,建议在根package.json中添加husky。

如果你只想测试一个hook,在脚本末尾加exit 1来终止git命令。

# .husky/pre-commit
# ...
exit 1 # Commit will be aborted

Conventional Commits

Conventional Commits是一种提交信息规范,是一种约定,使git提交信息对人和机器都更具可读性。

该规范约定提交信息应该具有如下结构:

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

如果想了解具体规范,请查阅官网

commitizen是遵循Conventional Commits规范的一个npm开发工具包,以命令行提示的方式让你更容易地按规范提交。它同时遵守Angular的约定提供了下面几种type:

  • feat: A new feature
  • fix: A bug fix
  • docs: Documentation only changes
  • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • refactor: A code change that neither fixes a bug nor adds a feature
  • perf: A code change that improves performance
  • test: Adding missing tests or correcting existing tests
  • build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
  • ci: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
  • chore: Other changes that don't modify src or test files
  • revert: Reverts a previous commit

安装:

yarn add -D commitizen

添加npm脚本:

"scripts": {
    "cz": "cz"
}

仓库commitizen友好化:

yarn commitizen init cz-conventional-changelog --dev --exact

OK,现在想要提交执行yarn cz按提示进行即可。

在pre-commit做测试或其他工作后失败导致终止提交,通过修改代码再次提交,可以通过--retry参数,运行yarn cz -- --retry重试上一次的提交。而不需要跟随commitizen提示,重新填写上次相同的commit内容。

然而,我们仍然可以通过git commit的方式提交不规范的记录。这时可以利用GIt hooks在commit-msg钩子中添加规范检查,commitlint就是这样一个检查工具包。

安装commitlint:

yarn add -D @commitlint/cli @commitlint/config-conventional

添加commitlint.config.js配置文件:

module.exports = {
    extends: ['@commitlint/config-conventional']
}

添加commit-msg钩子:

yarn husky add .husky/commit-msg "npx commitlint --edit"

OK,此时通过git commit提交不符合规范的记录,会失败并提示不符合规范的地方。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容