Open kevinuyoung opened 6 years ago
你们开发环境是windows么?我这边用windows/git bash,eslint报错后git commit依然成功。(git/2.15.1 node/6.10.2 npm/3.10.10)
@yidazh 用的Mac开发,我把DEMO下载看了下,测试后,eslint报错,commit后没有提交代码噢。如果 加了参数 git commit -m "fx" --no-verify
,是可以绕过审查的。
您好!按照我得理解,你输入 git commit -m 'xxxx'得话,会触发pre-commit钩子。也就是按照您说得触发precommit,然后执行后面得eslint检查。
写在script里面的,为什么git commit -m 'xxx'会触发,按照我的理解,不应该是npm run precommit触发么,就像npm run build一样,如果是npm run precommit触发,那么和git commit -m有什么关系了,我的最终疑惑是git -commit -m 不能够触发scirpt里面precommit的命令,
是因为husky,它监听到了git commit -m, 从而不用 npm run precommit命令,也会执行precommit么
"script": {
"precommit": "npm run eslint"
}
还是这个问题,您git commit -m 'xxx'。因为pre-commit执行了precommit,但是为什么checkFileSize会被触发,它不是git的钩子哇,我是哪里没理解到么
期望您的回答!万分感谢
@yizhengfeng-jj 看了下git-hook的原理,试着说下我的理解
当你用
git init
初始化一个项目的时候,钩子都被存储在当前项目下.git/hooks
子目录中
只要执行git commit 就好触发 .git/hooks/pre-commit
的执行,不同的git 命令对应不同的里面的文件名称, 里面可以写要执行的相关处理逻辑。husky的作用是把写好的 hooks逻辑加到这个目录下,已npm run -s xxxx
的形式再package.json中去自定义 相关的script脚步
husky 能指定hooks的执行顺序吗,比如我想先执行 commit-msg,再执行pre-commit 中的eslint检查。原因:如果我commit-msg失败了,我还需要再跑一次pre-commit,而 pre-commit 中的eslint检查是比较耗时的。
看了 @yizhengfeng-jj 的问题后,我思考了整个的执行流程。
1、首先要知道git在commit、merge、push时会执行git hooks,git的hooks放在项目根目录下的.git/hooks
如果你执行git commit -m 'add .gitignore'
那么会调用pre-commit(默认情况下没有该文件pre-commit.sample是git提供的模板
),该文件脚本使用Bash Shell书写。
这是git预设的
2、当你安装husky
(版本^0.14.3)时,会自动写入.git/hooks/pre-commit
文件,在代码53行有这段代码
npm run -s precommit || {
echo
echo "husky > pre-commit hook failed (add --no-verify to bypass)"
exit 1
}
我这里有张截图(图里的node -v
不会执行,因为会执行 npm run node -v
,我就懒得改了)
这应该可以解决你的疑问1
疑问2就简单了
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"eslint": "eslint src/**/*.js",
"checkFileSize": "cd tools && node checkfilesize.js",
"precommit": "npm run eslint && npm run checkFileSize",
"commitmsg": "cd tools && node checkcommitmsg.js ${GIT_PARAMS}"
}
git commit
会调用precommit,precommit里执行了eslint
和checkFileSize
同样commitmsg也是一个git预设的钩子
现在husky更新到4.3.0了,原理应该是类似。
为啥我的文件里打印 GIT_PARAMS 为空?使用了 husky,打印 HUSKY_GIT_PARAMS 也是为空呢?我是在 commit-msg.sh 文件里运行了 node checkcommitmsg.js ${GIT_PARAMS}
,但是这样拿不到这个变量呢?
我的版本"husky": "1.3.1", GIT_PARAMS改为HUSKY_GIT_PARAMS有值
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
手牵手使用Husky & Nodejs自定义你的Git钩子
概述
和其它版本控制系统一样,Git能在一些特定的重要动作发生时触发自定义脚本。Git钩子最常见的使用场景包括进行提交规范审核,代码规范审核,进行自动化部署等。在本篇文章中,我会用一个例子详细介绍使用Husky & nodeJs脚本配合使用Git常用钩子。
Git钩子在何方
当你用
git init
初始化一个项目的时候,钩子都被存储在当前项目下.git/hooks
子目录中。Git默认会在这个目录中放置一些示例脚本,这些脚本大多是shell和PERL语言,但是你可以使用任何脚本语言
。如果你想启用它们,需要将 .sample 这个后缀删除。背景
在多人协作的项目中,代码风格统一、代码提交信息的说明等重要性不言而喻。因此,在本篇文章中,我会介绍如下两个Git钩子:
NodeJs安装
安装过程就不详细介绍了,可以去官网直接下载
husky介绍
husky继承了Git下所有的钩子,在触发钩子的时候,husky可以阻止不合法的commit,push等等。
Eslint
介绍 ESLint 是一个开源的 JavaScript 代码检查工具,由 Nicholas C. Zakas 于2013年6月创建。在小项目或者小团队中,成员间可以拟定一份约定的代码规范并依靠自觉和人工检查去遵守这个规范来达到这个目的。但是随着规模的扩大的新成员的加入,这个问题就不能只靠自觉和人工来解决,我们需要强制和自动化来确保每个成员提交的代码都是符合规范的。
全局安装
项目搭建
github地址
git-hooksDemo
, 安装所需依赖,依次执行以下命令。项目结构如下
//如果是全局安装eslint 可以直接键入命令 eslint --init
当你在终端输入
git commit -m "xxx"
,提交代码的时候, 如果代码不符合Eslint规则,则可能会有如下错误提示:当然你可以根据提示 增加参数
git commit -m "xxx" --no-verify
绕过验证,强制提交。已经解决了提交前的Eslint代码检查工作。现在,有一个需求,在提交代码之前,
检查项目下所有图片文件大小是否符合要求
。我们结合上面所提到的,使用NodeJs脚本实现这个需求。 在package.json文件中,新增脚本命令如下:终端输入命令
git commit -m "xxx"
, 运行结果如下:precommit钩子,会先检查代码合法性,如果通过,再去检查所有图片大小合法性。
截取部分关键代码:
创建commit-msg钩子
客户端钩子,它会根据Git键入提交信息判断 提交信息是否符合团队规范性。
依旧在package.json新增脚本命令:
终端输入命令
git commit -m "xxx"
, 运行结果如下:当你在终端键入
git commit -m "HELLO- xxx"
的时候,就可以通过该检测。功能代码如下:
最后
pre-commit & commit-msg 两个钩子的用法已经介绍完了。 Git钩子还有很多功能,可以帮助开发者实现更好的功能需求。 感谢您的阅读,文章中的DEMO已经放在 github地址,欢迎提出issue,star是最好的了。2333333