使用git钩子对提交代码进行检查(pre-commit)

git挂钩简介

  • git hooks是一些自定义的脚本,用于控制git工作的流程,分为客户端钩子和服务端钩子。
  • 客户端钩子包括:pre-commitprepare-commit-msgcommit-msgpost-commit等,主要用于控制客户端git的提交工作流。服务端钩子:pre-receivepost-receiveupdate,主要在服务端接收提交对象时、推送到服务器之前调用。
  • git hooks位置位于每个git项目下的隐藏文件夹.git中的hooks文件夹里,进去后会看到一些hooks的官方示例,他们都是以.sample结尾的文件名。注意这些以.sample结尾的示例脚本是不会执行的,只有重命名后才会生效
    样本hooks
  • 具体内容可以参考git的文档

pre-commit

  • pre-commit是客户端hooks之一,也是接下来要介绍的钩子。pre-commitgit add提交之后,然后执行git commit时执行,脚本执行没报错就继续提交,反之就驳回提交的操作。
  • 这个钩子中可以实现:对将要提交的代码进行检查、优化代码格式、或者对提交的图片进行压缩等等任务。下面是用shell编写的具体代码:
STAGE_FILES=$(git diff --cached --name-only --diff-filter=ACM -- '*.vue' '*.js')
if test ${#STAGE_FILES} -gt 0
then
    echo '开始eslint检查'

    which eslint &> /dev/null
    if [[ "$?" == 1 ]]; then
        echo '没安装eslint'
        exit 1
    fi

    PASS=true

    for FILE in $STAGE_FILES
    do
        eslint $FILE
        if [[ "$?" == 1 ]]; then
      PASS=false
    fi
  done

  if ! $PASS; then
      echo "eslint检查没通过!"
      exit 1
  else
      echo "eslint检查完毕"
  fi

else
    echo '没有js文件需要检查'
fi

exit 0
  • 稍微解释下:首先用git diff获取到提交到暂存区的文件,我这里添加了过滤即只获取.vue和.js文件。
  • 然后判断eslint是否已安装,接着再对获取到的文件依次检查,当某个文件检查不通过时不会中断进程,会继续遍历所有文件,这样最后在控制台可以显示出所有检查不通过的文件信息
  • exit即表示退出当前脚本进程、后面接上状态码,0表示正常,会继续执行git commit的操作,其他情况表示出错,不会继续commit。
  • 将上面的代码保存为pre-commit,然后存放在.git/hooks中,然后每次执行git commit时就会使用eslint进行代码检查了。
    image

注意事项

  • 另外除了eslint,还可以使用其他更多的工具来检查代码,比如prettier来格式化代码,一些类名检查器来检查css代码等等,上述这些都可以写在pre-commit钩子里面。
  • eslint最好全局安装,必须要保证执行hooks的git目录下能够直接执行。
  • .git里面的文件,无法提交到git项目上去,所以最好在git目录最外层新建一个同名的hooks文件夹,把写好的脚步放里面。新clone该项目时,在根目录执行一下cp hooks/* .git/hooks/把脚本文件复制到.git里去。
  • 有时候也会遇到脚本文件没有执行权限的情况,这时hooks就无法生效,需要用到chomd指令给脚本文件加上执行权限。

推荐阅读更多精彩内容

  • 那天和室友在她同事在吃饭,突然聊到墨尔本阴雨天晒衣难的问题。 同事问:“你们没有买烘干机吗?” 我回:“我们刚从昆...
    科学摸鱼阅读 159评论 0 4
  • 引用类型的值(对象)是引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在...
    AlexTamir阅读 20评论 0 0