Skip to content

githooks

git docs

原生的 git hooks 有一个比较大的问题是 .git 文件夹下的内容不会被 Git 追踪。
这就表示,无法保证让一个仓库中所有的成员都使用同样的 git hooks
除非仓库的所有成员都手动同步同一份 git hooks,但这显然不是个好办法。

客户端 GitHook

客户端 GitHook调用时机说明
pre-commit在执行git commit命令生成提交对象之前被触发 (错误则中断)。常用来检查即将提交的快照,比如运行lint工具检查代码格式。
prepare-commit-msg在提交信息编辑器显示之前,提交对象创建完毕之后被触发。常用于给提交信息编辑器提供默认的提交信息,如修复bug时引用bug号等。
commit-msgcommit-msg在提交信息编辑器关闭后、提交对象生成之前被触发(错误则中断)。常用于检查提交信息是否符合格式要求。
post-commitpost-commit在整个提交过程完成后被触发。常用于通知其他工具提交已经完成。此钩子不能影响提交过程的结果。
pre-rebasepre-rebasegit rebase命令执行前被触发 (错误则中断)。常用于阻止对已经推送的提交进行rebase操作。
post-checkoutpost-checkoutgit checkoutgit switch成功运行后被触发。常用于提醒用户工作目录已经改变。
post-mergepost-mergegit merge成功运行后被触发。常用于通知用户有文件被合并。
pre-pushpre-pushgit push命令发送数据到远程仓库之前被触发 (错误则中断)。常用于确保不会推送错误的提交到远程仓库。

服务端 GitHook

服务端 GitHook调用时机说明
pre-receivepre-receive在远程仓库接收到git push数据并开始更新处理之前被触发。常用于实现权限控制和引用(branch、tag等)的规则检查。
updateupdate在远程仓库接收到git push数据,每个引用更新前被触发。与pre-receive类似。常用于实现权限控制和引用的规则检查。
post-receivepost-receive在远程仓库接收到git push数据并完成所有更新后被触发。常用于触发持续集成、部署等后续任务,或者向外部系统发送有关新提交的通知。

husky

husky 是一个支持所有客户端 GitHooks 的工具,在提交或推送时使用它来整理提交消息、运行测试、整理代码等。

bash
# 安装
npx i -wD husky
# 初始化
npx husky install
# 安装后自动启用Git挂钩
pnpm pkg set scripts.prepare="husky install"

# 配置 pre-commit 挂钩
npx husky add .husky/pre-commit "lint-staged"

#################################################
# 搭配 commitizen cz-conventional-changelog 使用 #
#################################################

# 安装
pnpm i -wD commitizen cz-conventional-changelog
# 手动配置 package.json 文件
# "config": {
#   "commitizen": {
#     "path": "cz-conventional-changelog"
#   }
# }
# 配置 prepare-commit-msg 挂钩
npx husky add .husky/prepare-commit-msg "exec < /dev/tty && node_modules/.bin/cz --hook || true"
# 测试
git add .
git commit
# 安装
npx i -wD husky
# 初始化
npx husky install
# 安装后自动启用Git挂钩
pnpm pkg set scripts.prepare="husky install"

# 配置 pre-commit 挂钩
npx husky add .husky/pre-commit "lint-staged"

#################################################
# 搭配 commitizen cz-conventional-changelog 使用 #
#################################################

# 安装
pnpm i -wD commitizen cz-conventional-changelog
# 手动配置 package.json 文件
# "config": {
#   "commitizen": {
#     "path": "cz-conventional-changelog"
#   }
# }
# 配置 prepare-commit-msg 挂钩
npx husky add .husky/prepare-commit-msg "exec < /dev/tty && node_modules/.bin/cz --hook || true"
# 测试
git add .
git commit

༼ つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿◕ _◕ ༽つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿ ̿̿