文章

怎样强制 commit 规范

怎样强制 commit 规范

想要规范每个人的 commit 习惯,光靠文档是不行的, 得强制执行, 有的人选择使用 git template 来规范队友的行为,其实之前我们团队也试过,最后的结果是: 并不是每个人都依照模板上的来, 这和文档约束没有啥区别,后来我们采用了 git hook 的方式,只要你不按照规定提交,就无法 commit,成效甚佳, 下面分享一下我自己平时使用的 hook。

安装 hook

  1. 在项目的根目录创建一个脚本 .githook.sh,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash

# 创建目标目录(如果不存在)
HOOK_DIR=".git/hooks"
mkdir -p "$HOOK_DIR"

# 写入钩子内容
cat > "$HOOK_DIR/commit-msg" <<'EOF'
#!/bin/bash

# 定义颜色常量
RED="\033[31m"
BLUE="\033[34m"
GREEN="\033[32m"
RESET="\033[0m"  # 重置颜色

# 读取提交信息
commit_message=$(cat "$1")

# 定义正则表达式
regex="^(feat|fix|docs|style|refactor|test|chore|perf|revert)(\([a-zA-Z0-9]+\))?:[[:space:]]+"

if ! [[ $commit_message =~ $regex ]]; then
  echo -e "${RED}提交信息不符合规范!${RESET}"
  echo -e "${BLUE}规范: <类型>(<影响范围>): <描述>${RESET}"
  echo -e "${BLUE}介绍:${RESET}"
  echo -e "${BLUE}feat      新功能${RESET}"
  echo -e "${BLUE}fix       bug修复${RESET}"
  echo -e "${BLUE}docs      文档变更${RESET}"
  echo -e "${BLUE}style     格式调整(空格/分号等,不影响代码)${RESET}"
  echo -e "${BLUE}refactor  代码重构(非功能/非bug修改)${RESET}"
  echo -e "${BLUE}test      测试相关${RESET}"
  echo -e "${BLUE}chore     构建/工具/配置等杂项${RESET}"
  echo -e "${BLUE}perf      性能优化${RESET}"
  echo -e "${BLUE}revert    回退提交${RESET}"
  echo -e "──────────────────────────────"
  echo -e "示例:"
  echo -e "fix(uart): 修复uart接丢包的bug"
  echo -e ""
  echo -e "温馨提示: 冒号后面有空格哦!要求是英文冒号哦!"
  echo -e ""
  exit 1
fi
EOF

# 设置可执行权限
chmod +x "$HOOK_DIR/commit-msg"

# 验证安装
if [ -x "$HOOK_DIR/commit-msg" ]; then
  echo -e "\033[32m✓ 钩子安装成功\033[0m"
  echo "路径:$HOOK_DIR/commit-msg"
else
  echo -e "\033[31m✗ 安装失败,请检查权限\033[0m"
  exit 1
fi

  1. 运行这个脚本即可安装

./.githook.sh

如何使用?

正常 commit 就行,hook 会被调用检查,并给出 commit 规范,按照规范提交即可,否则永远 commit 失败。

本文由作者按照 CC BY 4.0 进行授权