# 背景

1、项目上的 commit 信息并不是所有人都了解,导致项目的 commit 信息并不是按照已约束的规范提交。

2、小伙伴错合、误合 testbeta 等测试分支到迭代分支 / 主分支,造成分支污染。

# 处理思路

采用 git hook 来统一制定 commitmerge

# 环境条件

MacOS Idea

# 前置条件

使用正确的 grep 包,因为 mac 自带的 BSD grep 不支持 - P 参数,所以请安装使用 GNU grep

grep --version

avatar

# 配置步骤

1、将附录钩子文件下载好,打开控制台,进入根目录下

cd /

2、寻找 git 的 git-core 文件位置

find . -name git-core

3、一般来说是在 /usr/share 或者是 /usr/local/share 下面,举例:
avatar

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

avatar

avatar

# merge

使用 idea/eclipse 控制台,git 命令合并,合并方式采用非快进式,就会校验合并分支

git merge --no-ff xxx

如果合并了黑名单分支(testbeta),请使用下面命令回滚

git merge --abort

avatar

# 备注

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

# 参考

avatar