在开发过程当中,一般使用 eslint
来规范团队的代码风格。可是 eslint
只能在开发服务器启动的时候才去检验代码。若是一我的在不启动开发服务器的状况下,修改了代码直接提交到git,那么别人pull下来的代码确定会报错,咱们须要把错误遏制在提交以前。前端
惟一的麻烦多是地震的时候commit不太方便
------- 一位成都前端开发者留言说vue
git hooks
是git的一种钩子机制,可让用户在git操做的各个阶段执行自定义的逻辑。node
git hooks
在项目根目录的 .git/hooks
下面配置,配置文件的名称是固定的,使用shell
语法编写。git
里面包含 pre-commit
, pre-push
, commit-msg
等多种钩子,具体能够查看 Git 钩子。github
从头编写如此多的 shellshell脚本
太难,因此咱们使用 husky
来帮咱们自动生成这些 shell脚本
。
husky 就是一款用于处理 npmgit hooks
的npm包包。
安装好 windowshusky
,他会自动在项目的 .git/hooks
文件夹下面生成各类配置文件。
若是你在git init
以前已经安装了 husky
,那么须要卸载掉再重装才能使用。
不推荐使用 husky
来管理 pre-commit
,由于他只是简单的运行 npm run lint
命令来检测当前的文件状态,而没法检测仅仅暂存区的文件。推荐使用如下配置经过检测暂存区文件,来阻止不规范代码的提交。
这是 .git/hooks/pre-commit
文件的源码:bash
#!/bin/bash # 若是在commit时有未添加到暂存区的文件,拒绝提交 diff=$(git diff) if [[ $diff !=0 ]];then echo "some files is changed but not add to stash, git commit denied" exit 1 fi # 读取git暂存区的.js 和 .vue文件 files=$(git diff --cached --name-only | grep -E '\.js$|\.vue$') # 在控制台打印文件列表 echo $files # Prevent ESLint help message if no files matched # 若是文件列表为空,退出执行环境,继续执行commit操做 if [[ $files = "" ]] ; then exit 0 fi failed=0 # 循环文件列表 for file in ${files}; do # 判断文件是否存在(-e 表示 exists) if [ ! -e $file ] ; then continue fi # 在控制台打印该文件的eslint检验结果,若是经过,则返回空 git show :$file | ./node_modules/.bin/eslint $file --color --fix # 文件未经过eslint检验,标记为失败 if [[ $? != 0 ]] ; then failed=1 fi done; # 有文件未经过检验,退出执行环境,中断commit操做 if [[ $failed != 0 ]] ; then echo "❌ ESLint failed, git commit denied" exit $failed fi
从文件源码能够看出,git 将会在你将文件添加到暂存区后,执行eslint操做,通不过操做的时候,此次操做将被取消 (shell exit 1
)。服务器
经过测试发现,若是经过 yarn add
的方式安装 eslint
, babel-eslint
的话,这句代码将会报错:
git show :$file | ./node_modules/.bin/eslint $file --color --fix
只用用npm从新安装上面提到的一些包,才能在 ./node_modules/.bin
目录下找到eslint,不知道大家有没有遇到这样的问题。
git hooks
须要的 shell脚本
,须要是unix文件格式才能正常运行。
不然windows10系统会抛出换行符错误,而macOS则会抛出 pre-commit
不是文件或者文件夹的错误。
须要打开bash,使用以下命令修改,方可正常使用。
vi ./.git/hooks/pre-commit # 打开配置文件 :set ff-unix # 设置文件格式为unix文件,(ff意为fileformat) :wq # 保存修改并退出