美文网首页
使用git钩子对提交代码进行检查(pre-commit)

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

作者: ITgecko | 来源:发表于2018-04-23 22:14 被阅读0次

    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指令给脚本文件加上执行权限。

    相关文章

      网友评论

          本文标题:使用git钩子对提交代码进行检查(pre-commit)

          本文链接:https://www.haomeiwen.com/subject/vqwakftx.html