# 背景
1、项目上的 commit 信息并不是所有人都了解,导致项目的 commit 信息并不是按照已约束的规范提交。
2、小伙伴错合、误合 test、beta 等测试分支到迭代分支 / 主分支,造成分支污染。
# 处理思路
采用 git hook 来统一制定 commit、merge
# 环境条件
MacOS Idea
# 前置条件
使用正确的 grep 包,因为 mac 自带的 BSD grep 不支持 - P 参数,所以请安装使用 GNU grep
grep --version |

# 配置步骤
1、将附录钩子文件下载好,打开控制台,进入根目录下
cd / |
2、寻找 git 的 git-core 文件位置
find . -name git-core |
3、一般来说是在 /usr/share 或者是 /usr/local/share 下面,举例:
4、进入搜索到的 git-core 文件下 /templates/hooks 里,还是以 3 举例:
cd /usr/local/share/git-core/templates/hooks | |
pwd |
5、将下载好的钩子文件移动到步骤 4 的文件夹下
sudo mv ~/Downloads/prepare-commit-msg /usr/local/share/git-core/templates/hooks/ |
6、修改文件读写执行权限
cd /usr/local/share/git-core/templates/hooks/ | |
sudo chmod 755 prepare-commit-msg |
7、进入自己的项目路径,重新初始化 git 配置,将钩子配置文件初始化进去,例如:
cd ~/IdeaProjects/YOUR GIT PROJECT/ | |
git init |
# 使用方法
# commit
使用 idea/eclipse 控制台,git 命令提交,先将文件存到暂存区,再执行提交命令:
git add . (OR git add xxx/xxx/xxx/xxx.java) | |
git commit |


# merge
使用 idea/eclipse 控制台,git 命令合并,合并方式采用非快进式,就会校验合并分支
git merge --no-ff xxx |
如果合并了黑名单分支(test、beta),请使用下面命令回滚
git merge --abort |

# 备注
1、如果本次修改即是自己需要提交的全部内容,可用 git commit -a 代替 git add . git commit 2 个命令
PS:如果本次包含有新增文件,还是需要提前 git add . 再执行 git commit
git commit -a |
2、git merge --no-ff (非快进),才会触发该钩子,如果觉得手动输入麻烦可以对其配置别名进行操作
# 钩子
文件源码
#!/bin/bash | |
BLACKLIST=("beta" "test") | |
forbid_list=() | |
if [[ -e .git/MERGE_HEAD ]]; then | |
heads=`ls .git/refs/heads` | |
for bl in "${BLACKLIST[@]}"; do | |
if [[ -n `echo ${heads} | grep -oP "(^| )${bl}($| )"` ]]; then | |
forbid_list+=(`cat .git/refs/heads/${bl}`) | |
fi | |
done | |
merge_head=`cat .git/MERGE_HEAD` | |
for br in "${forbid_list[@]}"; do | |
if [[ ${merge_head} == ${br} ]]; then | |
echo -e "\033[41;37m 合并了黑名单中的分支 \033[0m\n\r" | |
echo -e "\033[41;37m 请使用 git merge --abort 命令终止合并 \033[0m" | |
exit 1 | |
fi | |
done | |
else | |
echo "1、'feat' // 添加新功能" | |
echo "2、'fix' // 修复bug,可以在footer写上修复的bug编号" | |
echo "3、'doc' // 添加文档" | |
echo "4、'style' // 修改代码格式以及风格使代码看起来更清晰" | |
echo "5、'refactor' // 不改变功能的情况下修改和优化代码" | |
echo "6、'test' // 增加测试用例" | |
echo "7、'chore' // 增加一些杂项,比如添加依赖、修改构建过程" | |
echo "\r" | |
read -p "请输入要提交的类型: " TYPE_CODE < /dev/tty | |
read -p "请输入要提交的内容描述: " COMMIT_DESC < /dev/tty | |
case ${TYPE_CODE} in | |
"1") | |
TYPE="feat" | |
;; | |
"2") | |
TYPE="fix" | |
;; | |
"3") | |
TYPE="doc" | |
;; | |
"4") | |
TYPE="style" | |
;; | |
"5") | |
TYPE="refactor" | |
;; | |
"6") | |
TYPE="test" | |
;; | |
"7") | |
TYPE="chore" | |
;; | |
esac | |
echo "["${TYPE}"]: "${COMMIT_DESC} > $1 | |
fi |
# 参考
