git hooks——commit message 校验

git是现在最流行的版本控制工具,书写良好的commit message能大大提高代码维护的效率。但是在日常开发中由于缺少对于commit message的约束,导致填写内容随意、质量参差不齐,可读性低亦难以维护。在项目中引入commit message规范已是迫在眉睫。

提交规范

  • 源于 Angular 规范

  • 提交格式 <type>(<scope>): <subject>

  • commit message 示例:

    1
    feat(数据中心): HS001 增加订单列表
  • type 选项

    • feat:新功能(feature)
    • fix:修补bug
    • docs:文档(documentation)
    • style: 格式(不影响代码运行的变动)
    • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
    • test:增加测试
    • chore:构建过程或辅助工具的变动
    • perf: 性能提升变更
    • ci : 持续集成变更
    • build : 代码构建变更
    • temp : 临时代码
  • scope

    • 变更范围(粒度较小,并在一想 项目中保持一致):例如页面名称、模块名称、组件名称……
  • subject

    • 简短的描述

添加 hook

  • 在目前添加在本地的 git hook 中,校验阶段是 commit-msg 阶段。脚本内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

msg=`awk '{printf("%s",$0)}' $1`

# Merge 的时候,会自动生成 Commit Message, 长成这样的: Merge branch 'master' into test-abc, 这种跳过
mergePatten='^Merge '
if [[ $msg =~ $mergePatten ]]; then
echo "😁😁😁合并分支自动生成的 CommitMessage, 跳过!"
exit 0
fi

# 非 Merge 开头的,认为是手动提交的信息,需要遵循这种格式
patten='^(feat|fix|test|refactor|docs|style|chroe)\(.*\):.*$'
if [[ $msg =~ $patten ]]; then
echo "😁😁😁太棒了!"
else
echo "😭😭😭 兄弟,别瞎搞提交的 message 格式不对"
echo "提交参考格式: <类型>[可选的作用域]: <描述>"
exit 1
fi
  • 添加目录

将上面的脚本保存成 commit-msg 文件,然后进行以下操作。

工程.git 目录 -> hooks -> commit-msg

hooks 目录中会存在 commit-msg.sample,这是 git 的 hook 参考文件。

全局添加

如果每个工程的 .git 目录下的 hooks 都添加一遍会过于繁琐,使用全局的会很省事(可选)。

  • home 目录下创建 .git_hook 目录

    1
    mkdir ~/.git_hooks
  • 复制 commit-msg 文件到上面创建的 .git_hook 目录下

    1
    cp comit-msg /.git_hooks
  • 全局添加该脚本

    1
    git config --global core.hooksPath ~/.git_hooks