git挂钩简介
- git hooks是一些自定义的脚本,用于控制git工做的流程,分为客户端钩子和服务端钩子。
- 客户端钩子包括:
pre-commit
、prepare-commit-msg
、commit-msg
、post-commit
等,主要用于控制客户端git的提交工做流。服务端钩子:pre-receive
、post-receive
、update
,主要在服务端接收提交对象时、推送到服务器以前调用。
- git hooks位置位于每一个git项目下的隐藏文件夹.git中的hooks文件夹里,进去后会看到一些hooks的官方示例,他们都是以.sample结尾的文件名。注意这些以.sample结尾的示例脚本是不会执行的,只有重命名后才会生效
- 具体内容能够参考git的文档
pre-commit
pre-commit
是客户端hooks之一,也是接下来要介绍的钩子。pre-commit
在git 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
指令给脚本文件加上执行权限。