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结尾的示例脚本是不会执行的,只有重命名后才会生效
样本hooks
- 具体内容可以参考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进行代码检查了。
image
注意事项
- 另外除了
eslint
,还可以使用其他更多的工具来检查代码,比如prettier来格式化代码,一些类名检查器来检查css代码等等,上述这些都可以写在pre-commit钩子里面。
-
eslint
最好全局安装,必须要保证执行hooks的git目录下能够直接执行。
-
.git
里面的文件,无法提交到git项目上去,所以最好在git目录最外层新建一个同名的hooks
文件夹,把写好的脚步放里面。新clone该项目时,在根目录执行一下cp hooks/* .git/hooks/
把脚本文件复制到.git里去。
- 有时候也会遇到脚本文件没有执行权限的情况,这时hooks就无法生效,需要用到
chomd
指令给脚本文件加上执行权限。
网友评论