04-git提交规范
git提交规范¶
提交格式
- 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将是如下的格式:
强制检查并规范美化¶
为了强制自己使用这些提交词汇,可以通过设置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: 🐛