TOC

Git Hooks

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)