git commit 添加校验

需求是,在git commit时,对commit的内容进行校验。Git Commit Message Convention

比如我们要求的一个规范:

git commit注释规范

提交格式

():

// 空一行

提交的具体情况说明

type(必需)、scope(可选)和subject(必需)

(可选)
  • type

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

br: 此项特别针对bug号,用于向测试反馈bug列表的bug修改情况
feat:新功能(feature) —关联需求id
fix:修补bug —关联bug的id
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动
revert: feat(pencil): add ‘graphiteWidth’ option (撤销之前的commit)

  • scope

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

  • subject

subject是 commit 目的的简短描述,不超过50个字符。
以动词开头,使用第一人称现在时,比如change,而不是changed或changes
第一个字母小写
结尾不加句号(.)

  • body

部分是对本次 commit 的详细描述,可以分成多行。

那么要怎么实现能不依赖开发人员的自觉性,强制commit的内容符合规范呢,接着就说一下实现方法。

  1. 在项目根目录下添加scripts文件夹,
    新建verify-commit-msg.js文件。
    js文件的内容是:
const chalk = require('chalk');

const msgPath = process.env.GIT_PARAMS;
const msg = require('fs').readFileSync(msgPath, 'utf-8').trim();

const commitRE = /^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50}/;

if (!commitRE.test(msg)) {
  console.log();
  console.error(
    `  ${chalk.bgRed.white(' ERROR ')} ${chalk.red('invalid commit message format.')}\n\n${
      chalk.red('  Proper commit message format is required for automated changelog generation. Examples:\n\n')
    }    ${chalk.green('feat(compiler): add \'comments\' option')}\n`
    + `    ${chalk.green('fix(v-model): handle events on blur (close #28)')}\n\n${
      chalk.red('  See https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md for more details.\n')
    }${chalk.red(`  You can also use ${chalk.cyan('npm run commit')} to interactively generate a commit message.\n`)}`,
  );
  process.exit(1);
}

  1. Package.json文件添加
"gitHooks": {
    "commit-msg": "node scripts/verify-commit-msg.js"
}
  1. 安装 yorkie

npm i yorkie --save-dev

此时再去根目录下.git/hooks查看文件就会发现有很多自动生成的可执行文件(不是以.sample为后缀的文件)。我的这个例子是在git commit时做的hook,如果要加入别的钩子,可以在package.json中添加其他规则。到这一步,就已经成功了,下次git commit 时就会对你提交的内容进行校验了。

注意:

注意一点,.git 和 package.json要在同一目录下。否则安装 yorkie 时,自动生成的校验git的目录指向不对,相应的就不会自动生成 .git/hooks 下的可执行文件。

假如你的目录不对,想自己新建一个可执行文件,那么下面就是我粘贴过来的我的commit-msg的可执行文件的内容,可以当作参考。

在.git/hooks下的文件现在都是以.sample为后缀的文件,不能直接运行,要新建commit-msg文件,文件内容为:

#!/bin/sh
#yorkie 2.0.0

command_exists () {
  command -v "$1" >/dev/null 2>&1
}

has_hook_script () {
  [ -f package.json ] && cat package.json | grep -q "\"$1\"[[:space:]]*:"
}

# OS X and Linux only
load_nvm () {
  # If nvm is not loaded, load it
  command_exists nvm || {
    export NVM_DIR="$1"
    [ -s "$1/nvm.sh" ] && . "$1/nvm.sh"
  }
}

# OS X and Linux only
run_nvm () {
  # If nvm has been loaded correctly, use project .nvmrc
  command_exists nvm && [ -f .nvmrc ] && nvm use
}

cd "."

# Check if commit-msg is defined, skip if not
has_hook_script commit-msg || exit 0

# Add common path where Node can be found
# Brew standard installation path /usr/local/bin
# Node standard installation path /usr/local
export PATH="$PATH:/usr/local/bin:/usr/local"

# Try to load nvm using path of standard installation
load_nvm /Users/yuhong/.nvm
run_nvm

# Export Git hook params
export GIT_PARAMS="$*"

# Run hook
node "./node_modules/yorkie/src/runner.js" commit-msg || {
  echo
  echo "commit-msg hook failed (add --no-verify to bypass)"
  exit 1
}

上面的文件中注意:

/*
 /Users/yuhong/     yuhong 是我自己电脑的命名,在本地调试的时候注意修改。
*/ 
load_nvm /Users/yuhong/.nvm

最后还是要说一下,.git 和 package.json 不在统一目录下,可以自己在本地新建可执行文件,这样在你的电脑上提交也会同样执行这个hook对你的提交内容进行校验。但是团队合作中就要注意,直接 git pull 下来的项目内容,即便npm install 也并不能使得小伙伴的 .git/hooks 下生成可执行的文件。小伙伴提交时就还是不能进行校验。为了更好的团队合作,注意.git 和 package.json 是否在同一目录下呦!(这是我经历过的坑。。。)

你可能感兴趣的:(git)