在开发过程中,通常使用 eslint 来规范团队的代码风格。但是 eslint 只能在开发服务器启动的时候才去检验代码。如果一个人在不启动开发服务器的情况下,修改了代码直接提交到git,那么别人pull下来的代码肯定会报错,我们需要把错误遏制在提交之前。

唯一的麻烦可能是地震的时候commit不太方便

------- 一位成都前端开发者留言说

git hooks 是什么

git hooks 是git的一种钩子机制,可以让用户在git操作的各个阶段执行自定义的逻辑。

git hooks 在项目根目录的 .git/hooks 下面配置,配置文件的名称是固定的,使用shell语法编写。

里面包含 pre-commit , pre-push , commit-msg等多种钩子,具体可以查看 Git 钩子

从头编写如此多的 shell脚本 太难,所以我们使用 husky 来帮我们自动生成这些 shell脚本

husky是什么

husky 就是一款用于处理 git hooks 的npm包包。

安装好 husky,他会自动在项目的 .git/hooks 文件夹下面生成各种配置文件。

如果你在git init之前已经安装了 husky,那么需要卸载掉再重装才能使用。

pre-commit 举例

不推荐使用 husky 来管理 pre-commit,因为他只是简单的运行 npm run lint命令来检测当前的文件状态,而无法检测仅仅暂存区的文件。推荐使用以下配置通过检测暂存区文件,来阻止不规范代码的提交。

这是 .git/hooks/pre-commit 文件的源码:

#!/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)。

注意,需要使用npm而不是yarn安装node_modules

通过测试发现,如果通过 yarn add 的方式安装 eslint , babel-eslint 的话,这句代码将会报错:

git show :$file | ./node_modules/.bin/eslint $file --color --fix

只用用npm重新安装上面提到的一些包,才能在 ./node_modules/.bin 目录下找到eslint,不知道你们有没有遇到这样的问题。

注意,需要使用unix文件编码

git hooks 需要的 shell脚本,需要是unix文件格式才能正常运行。

否则windows10系统会抛出换行符错误,而macOS则会抛出 pre-commit 不是文件或者文件夹的错误。

需要打开bash,使用如下命令修改,方可正常使用。

vi ./.git/hooks/pre-commit     # 打开配置文件
:set ff-unix # 设置文件格式为unix文件,(ff意为fileformat)
:wq # 保存修改并退出

[git hooks] pre-commit 配置的更多相关文章

  1. git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题

    在同步本地文件到线上仓库的时候 报错 pre -commit hook failed (add --no-verify to bypass) 当你在终端输入git commit -m "xx ...

  2. 8.3 Customizing Git - Git Hooks 钩子 自动拉取 自动部署 提交工作流钩子,电子邮件工作流钩子和其他钩子

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...

  3. CentOS6.4下Git服务器Gitosis安装配置

    1.安装GIt: #yum install git 2.增加一个git用户 #useradd git #passwd git 3.创建git仓库存储目录,设置权限 #mkdir /home/git/r ...

  4. Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务

    Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...

  5. 使用Git Hooks实现开发部署任务自动化

    前言 版本控制,这是现代软件开发的核心需求之一.有了它,软件项目可以安全的跟踪代码变更并执行回溯.完整性检查.协同开发等多种操作.在各种版本控制软件中,git是近年来最流行的软件之一,它的去中心化架构 ...

  6. 012-基于 git hooks 的前端代码质量控制解决方案

    原文看这里:https://github.com/kuitos/kui...全部文章看这里 https://github.com/kuitos/kui... 国际惯例先说下故事背景 通常情况下,如果我 ...

  7. 通过Gradle Plugin实现Git Hooks检测机制

    背景 项目组多人协作进行项目开发时,经常遇到如下情况:如Git Commit信息混乱,又如提交者信息用了自己非公司的私人邮箱等等.因此,有必要在Git操作过程中的适当时间点上,进行必要的如统一规范.安 ...

  8. 8.3 Customizing Git - Git Hooks

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...

  9. vite vue3 规范化与Git Hooks

    在 <JS 模块化>系列开篇中,曾提到前端技术的发展不断融入很多后端思想,形成前端的"四个现代化":工程化.模块化.规范化.流程化.在该系列文章中已详细介绍了模块化的发 ...

随机推荐

  1. pycharm的放大和缩小字体的显示 和ubunt的截圖工具使用 ubuntu上安装qq微信等工具

    https://www.cnblogs.com/sui776265233/p/9322074.html#_label0 ubuntu: 截圖工具的使用 在ubuntu 10.04 的时候,还可以很方便 ...

  2. LUA 运算笔记

    循环 比如要实现这样的一个For for(int i=10;i>1;i—) { print(i) } lua的for循环 转换成LUA for i=10,1,-1 do print(i) end ...

  3. months_between()用法

    orcl中months_between()函数用法如下: 格式:即MONTHS_BETWEEN(日期1,日期2) 例如: select months_between(to_date('2018-10- ...

  4. 脱壳_01_虚拟机壳_VMP

    写在前面的话: 上一篇文章中,带领大家一起分析了简单的压缩壳ASPACK,今天,就和大家一起来揭开VMP这道神秘的面纱: [花指令]:扰乱调试器的,并不执行: [混淆]:对原指令进行拆解或等价替换,会 ...

  5. Tidb进行缩减扩容tikv节点

    这两天接到任务说是要进行测试缩减机器给集群带来的负面效果有哪些. 然后我就按照官方的教程将机器进行了缩减,主要是缩减tikv节点 我们先来看看官方的文章是怎么写的: 步骤都没有什么问题,就是进行到第二 ...

  6. TiDB数据库 mydumper与loader导入数据

    从mysql导出数据最好的方法是使用tidb官方的工具mydumper. 导入tidb最好的方法是使用loader工具,大概19.4G每小时的速度. 详细的步骤可以参考官网:https://pingc ...

  7. 根据进程ID查找运行程序目录

    查看进程ID [root@hadoop03 openresty]# netstat -nltp 进入/proc目录查找相应进程ID目录并进入此目录 [root@hadoop03 usr]# cd /p ...

  8. linux禁止非法用户试探登录

    当我们的linux主机一旦暴露在互联网上,就会遭受到来自网络上的一些非法用户的骚扰.如弱口令扫描,试探性登录:这些行为对linux主机构成一定的威胁.那怎样防范此类的攻击了,这里写了一个脚本,功能就是 ...

  9. html5式程序员表白

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/whqet/article/details/26394493 前端开发whqet,csdn,王海庆,w ...

  10. 天地图api地址

    天地图地址 http://lbs.tianditu.com/api-new/examples.html 参考资料 http://lbs.tianditu.com/api-new/class.html