https://mp.weixin.qq.com/s/67qBDteTmHROeMwOBUeyaw
如何通过 Git 和 Husky 添加提交钩子并实现代码任务自动化
钩子 | 时机 | 用途 |
---|---|---|
pre-commit |
提交之前 | 代码检查 |
prepare-commit-msg |
提交信息生成之前 | 生成提交信息 |
commit-msg |
提交信息保存之前 | 检验提交信息 |
post-commit |
提交之后 | 通知,自动测试,CI 等 |
pre-push |
push 之前 | 代码检查,测试,编译打包 |
applypatch-msg |
生成补丁时 | 验证补丁信息 |
fsmonitor-watchman |
文件系统监视器发现变化时 | 触发版本控制操作 |
pre-applypatch |
应用补丁之前 | 验证补丁信息 |
pre-merge-commit |
合并之前 | 检查将要合并的分支是否符合要求 |
pre-rebase |
rebase 操作之前 | - |
push-to-checkout |
- | - |
pre-receive |
接受提交之前 | 代码检查,校验权限 |
post-receive |
接受提交之后 | 通知,自动测试,CI 等 |
update |
更新操作之前(分支、Tag) | 提供从旧版本到新版本的改动列表供用户审核 |
post-update |
更新操作之后(分支、Tag) | 通知,自动测试,CI 等 |
示例
pre-receive
#!/usr/bin/env python
"""
每个人都只能提交代码到 username-date-branchName
username 是 git 用户名
date 是 mmdd 日期
branch 是分支描述,支持小写字母、数字、横杠,2 到 16 个字符
"""
import re
import subprocess
import sys
# 获取提交者的用户名
author = subprocess.check_output(['git', 'config', 'user.name']).decode().strip()
# 获取提交的分支名称
branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode().strip()
# 定义分支名称的正则表达式
branch_pattern = r'^%s-\d{4}-[a-z0-9\-]{2,}$' % (author,)
# 检查分支名称是否符合正则表达式
if not re.match(branch_pattern, branch):
print('Error: Branch name "{}" does not match the required pattern "{}"'.format(branch, branch_pattern), file=sys.stderr)
sys.exit(1)
# 解析日期并检查其是否合法
try:
_, date_str, _ = branch.split('-')
month, day = int(date_str[:2]), int(date_str[2:])
if month < 1 or month > 12 or day < 1 or day > 31:
raise ValueError
except ValueError:
print('Error: Invalid date format in branch name "{}"'.format(branch), file=sys.stderr)
sys.exit(1)