git hooks之——pre-commit

git挂钩简介

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

注意事项

  • eslint最好全局安装,必须要保证执行hooks的git目录下能够直接执行。
  • .git里面的文件,无法提交到git项目上去,所以最好在git目录最外层新建一个同名的hooks文件夹,把写好的脚步放里面。新clone该项目时,在根目录执行一下cp hooks/* .git/hooks/把脚本文件复制到.git里去。
  • 有时候也会遇到脚本文件没有执行权限的情况,这时hooks就无法生效,需要用到chomd指令给脚本文件加上执行权限。

你可能感兴趣的:(git hooks之——pre-commit)