跳转至

04-git提交规范

git提交规范

提交格式

type (scope):subject
空行
body
空行
  • type部分说明:

用于说明git commit的类别,只允许使用下面的标识。

  • feat:新功能(feature)。
  • fix:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
  • docs:文档(documentation)。
  • style:格式(不影响代码运行的变动)。
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)。
  • perf:优化相关,比如提升性能、体验。
  • test:增加测试。
  • chore:构建过程或辅助工具的变动,以及一些杂项
  • revert:回滚到上一个版本。
  • merge:代码合并。
  • sync:同步主线或分支的Bug。

  • scope

scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

  • subject

subject是commit目的的简短描述,不超过50个字符。

描述使用的语言:看团队,中英文均可,结尾不加句号或其他标点符号。

根据以上规范git commit message将是如下的格式:

fix(DAO):用户查询缺少username属性 

feat(Controller):用户查询接口开发

强制检查并规范美化

为了强制自己使用这些提交词汇,可以通过设置git hooks来约束自己的提交消息,其次我想给我的消息自动加上一些emoji,让提交的消息更美观。

hooks会在你每次提交时自动触发,无论你使用的是命令行、LazyGit 还是其他 Git 客户端,都能正常运行这个脚本。

以下是我的一些需求提示词,然后发给AI帮我生成hooks

下面是我的具体需求:
---
如果消息是fix: 开头,   自动替换为fix: 🐛
如果消息是feat: 开头,  自动替换为feat: ✨
如果消息是style: 开头, 自动替换为style: 🎨
如果消息是chore: 开头, 自动替换为chore: 🧹
如果消息是docs: 开头,  自动替换为docs: 📖
如果消息是refactor: 开头,  自动替换为refactor: 🔨
如果消息是perf: 开头,  自动替换为perf: 🚀
如果消息是test: 开头,  自动替换为test: 🚦
如果消息是debug: 开头, 自动替换为debug: 🧪

---

帮我写一个通用的配置,如果不能放到全局配置文件,那就生成一个配置这个的脚本,方便我在各种项目一键配置

AI帮我生成prepare-commit-msg的代码,

#!/bin/sh

# 配置需要添加emoji的提交类型映射
declare -A EMOJI_MAPPING=(
  ["fix:"]="fix: 🐛"
  ["feat:"]="feat: ✨"
  ["style:"]="style: 🎨"
  ["chore:"]="chore: 🧹"
  ["docs:"]="docs: 📖"
  ["refactor:"]="refactor: 🔨"
  ["perf:"]="perf: 🚀"
  ["test:"]="test: 🚦"
  ["debug:"]="debug: 🧪"
)

# 获取提交信息文件路径
COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")

# 检查提交信息是否为空(跳过空提交)
if [ -z "$(echo "$COMMIT_MSG" | tr -d '[:space:]')" ]; then
  exit 0
fi

# 检查是否为合并提交或revert提交(跳过特殊提交)
if echo "$COMMIT_MSG" | grep -q '^Merge:' || echo "$COMMIT_MSG" | grep -q '^Revert:'; then
  exit 0
fi

# 检查提交信息是否匹配任何允许的类型
valid_type=false
for type in "${!EMOJI_MAPPING[@]}"; do
  # 检查提交信息是否以指定类型开头
  if echo "$COMMIT_MSG" | grep -q "^$type "; then
    # 替换为带emoji的类型
    sed -i.bak "1s/^$type /${EMOJI_MAPPING[$type]} /" "$COMMIT_MSG_FILE"
    valid_type=true
    break
  elif echo "$COMMIT_MSG" | grep -q "^$type$"; then
    # 处理关键词后没有空格的情况
    sed -i.bak "1s/^$type$/${EMOJI_MAPPING[$type]} /" "$COMMIT_MSG_FILE"
    valid_type=true
    break
  fi
done

# 删除备份文件(sed在macOS上会创建备份文件)
[ -f "$COMMIT_MSG_FILE.bak" ] && rm "$COMMIT_MSG_FILE.bak"

# 如果不是有效类型,拒绝提交
if [ "$valid_type" = false ]; then
  echo "❌ 提交信息必须以以下类型之一开头:" >&2
  for type in "${!EMOJI_MAPPING[@]}"; do
    echo "   - ${EMOJI_MAPPING[$type]}" >&2
  done
  exit 1
fi

# 打印修改信息(可选)
NEW_COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
if [ "$COMMIT_MSG" != "$NEW_COMMIT_MSG" ]; then
  echo "提交信息已自动格式化为: ${NEW_COMMIT_MSG%%$'\n'*}..."
fi

只需要在~/.config/git/.githooks文件夹下创建prepare-commit-msg文件,然后配置全局的hooks路径为~/.config/git/.githooks就行。

可以随便在一个地方, 1. 先创建.githooks文件夹; 2. 在这个文件夹下创建创建prepare-commit-msg文件; 3. 写入上面的内容,然后执行以下脚本完成所有的配置

# 复制到~/.config/git/.git-hooks
cp -r .git-hooks ~/.config/git/.git-hooks
# 配置全局路径为~/.config/git/.git-hooks
git config --global core.hooksPath ~/.config/git/.git-hooks

这样每次提交代码,只需要写fix:开头,后面写你的消息,回车完成提交之后,脚本就会自动帮你替换为fix: 🐛

评论