git commit前检测husky与pre-commit 提交钩子
git commit前检测husky与pre-commit
git commit前检测husky与pre-commit - 简书 https://www.jianshu.com/p/f0d31f92bfab
Prettier · Opinionated Code Formatter https://prettier.io/
{ "husky": { "hooks": { "pre-commit": "pretty-quick --staged" } } }
prevent commit时,我们可以把eslint以及test命令加上,检测代码规范:
"scripts": {
"precommit": "lint-staged && npm run test"
git中提供了一组hook,规定了每个hook的名字,以及hook接收的参数个数和每个参数的含义。用户如果要使用hook的话,需要在.git/hooks/目录中创建对应名字的hook文件,赋予该文件可执行权限,用bash或者python或者其它脚本语言来实现该hook具体要做哪些事。hook就是类似于onClick()、onRun()这样的事件,也可以理解成是一组回调函数。
git commit是最常用的命令之一,它可以触发四个hook,分别是pre-commit,prepare-commit-msg,commit-msg和post-commit。从字面上可以猜测到这四个hook分别对应“commit之前”、“准备commit log message的时候”、“生成commit log message的时候”、“commit之后”这四个触发时机。这四个hook也的确是按照这个先后顺序被触发的。如果git commit时使用了-n(等价于--no-verify)参数的话,pre-commit和commit-msg就不会被触发。
pre-commit不接收参数。这个hook可以用来在commit之前检查修改的代码是否符合规范、检查文件名是否含有空格、或者仅仅单纯地输出“hello world”等等,具体想要做什么可以根据实际情况来决定。如果以非0状态退出的话,譬如检测到文件名中有空格,而用户不希望这种文件被commit,在这种情况下执行exit 1,那么git commit会以失败而终止。
prepare-commit-msg接收三个参数。第一个是commit log message所在的文件名,通常是.git/COMMIT_EDITMSG。第二个是commit log message的来源。在《git commit中输入message的几种方式》 中有介绍过-m,不加参数,-c,-C,-F,-t等方式输入commit log message,这些都是不同的来源。如果是-m的话,第二个参数的值是"message";如果是不加参数的话,第二个参数的值是"";如果是-c或-C或者其他情况但加了--amend参数的话,第二个参数的值是"commit";如果是-F的话,第二个参数的值是"message";如果是-t或者设置了commit.template的话,第二个参数的值是"template"。
如果第二个参数不是"commit",那第三个参数值为""。如果第二个参数值是“commit"的话,那第三个参数值就是-c或者-C后面接的那个值,可能是tag name、branch name、HEAD、HEAD^1、具体的某个commit SHA-1等等。有--amend的话,第三个参数值是"HEAD"。
此外,git merge和git cherry-pick可能会触发这个hook。git merge如果是ff(fast-forward) merge那不会触发这个hook,但如果发生no-ff类型的merge,或者git merge --no-ff,那么会触发这个hook,第二个参数值为"merge";git merge --squash && git commit的情况下,第二个参数值为"squash"。git cherry-pick默认情况下会触发这个hook,除非使用了-n(等价于--no-commit)参数,第二个参数值为"message"。
理论上来说,pre-commit中的事情可以放到prepare-commit-msg中来做,但不推荐这么做 。prepare-commit-msg的设计本意是在commit-msg之前编辑message文件用的。譬如,希望在commit log message中记录下当前某个系统的某些状态值(譬如jenkins上某个编译job的环境变量和用户变量),那可以在prepare-commit-msg中对准备用于-F或者-t的文件进行编辑,将那些实时获取的状态值插入到文件中去。然后这个文件的内容会被写入.git/COMMIT_EDITMSG,commit成功以后,这些内容就变成了commit log message的一部分。当然,这些内容也可以在git commit之前组织好,然后在git commit的时候直接用起来。但如果放在hook里来做,就等于封装到了git commit的内部。用户可以根据实际情况考量是否需要用这个hook。同样的,这个hook如果以非0状态退出的话,会使git commit失败而终止。
和prepare-commit-msg比起来,commit-msg使用的场景更多些。这个hook接收一个参数,commit log message所在的文件名,通常是.git/COMMIT_EDITMSG。从这个文件中,可以读取到最终运用于commit log message的内容。比较常见的运用是在这里检查commit log message是否符合事先规定的格式。另外一个实际运用是使用gerrit系统的场合下,git commit时会根据已有的信息生成一个类似commit SHA-1的Change-Id,并将其插入到commit log message中去。生成Change-Id的算法会用到用户编辑完成后的commit log message的内容,所以生成Change-Id的动作不能在commit-msg之前做。同样的,这个hook如果以非0状态退出的话,会使git commit失败而终止。
post-commit在commit完成后被触发,不接收参数。post-commit能够执行,说明git commit已经成功了。接下来可以做很多事,譬如执行git push到一个备份branch上,或者启动编译,或者关机(每天只做一个commit),或者也可以很无聊地git reset --hard回到新生成的commit的parent上(这么做毫无意义),也可以把硬盘格式化掉(再见!)
要试验这四个hook的话,可以在.git/hooks/下创建四个文件,文件名分别为pre-commit,prepare-commit-msg,commit-msg,post-commit,将它们都改为可执行文件。假如要用hook打印每个hook接收了哪些参数:
#!/usr/bash
echo $@
或者
#!/usr/bin/env python
import sys
print sys.argv
然后执行各种git commit看看效果吧。别忘了每个hook的参数列表第0个是hook文件的路径,后面才是接收的参数。hook是一扇门,你的脑洞有多大,门后面的世界就有多大。
- git用户执行
git push操作 - 远程仓库发现有用户执行了push操作,就会执行一个脚本
post-receive(钩子) - 在
post-receive脚本中,将git仓库的代码拷贝到web站点目录下
git commit前检测husky与pre-commit 提交钩子的更多相关文章
- 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 ...
- 在git push前怎样遗弃掉历史commit
今天写了一天代码,然后 git hub commit 了 多达 7 次. 可是都没有把改动正式推送上去. 结果最后要推送的时候发现中间有一个提交文件超过了100M. 是 vs 的代码性能分析报告 .v ...
- SonarQube 之 gitlab-plugin 配合 gitlab-ci 完成每次 commit 代码检测
转载自:https://cloud.tencent.com/developer/article/1010601 1.背景介绍 我们知道使用 SonarQube 可以在日常开发中检测代码质量,除了使用 ...
- git移除上一次的commit中误添加的文件
在使用git进行版本管理时,往往会出现一些误操作,比如将一些不加上传的文件放到了暂存区,即上传到了上一次commit中 比如: commit c134ab90ca7c4daf8bfa22e3ad706 ...
- Git CMD - diff: Show changes between commits, commit and working tree, etc
命令格式 git diff [options] [<commit>] [--] [<path>…] git diff [options] --cached [<comm ...
- git将多个commit合并成一个新的commit
问题: 有以下commit: 323udd ede234 6e7s6e 要合并第一个和第二个commit 方法有二: 方法一 使用git rebase -i hash-id,-i表示以交互模式进行co ...
- git commit 出现 changes not staged for commit 错误
git commit 出现 changes not staged for commit 错误 修复: 参考:http://stackoverflow.com/questions/8488887/git ...
- Git撤销对远程仓库的push&commit提交
撤销push 1. 执行 git log查看日志,获取需要回退的版本号 2. 执行 git reset –soft <版本号> ,如 git reset -soft 4f5e9a90ed ...
- 前端规范之Git工作流规范(Husky + Comminilint + Lint-staged)
代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...
随机推荐
- AspectJ之@DeclareParents注解为对象添加新方法
众所周知,AspectJ可以通过@Before,@After,@Around等注解对连接点进行增强,今天我们来玩一个新注解@DeclareParents.对目标对象增强一个新方法. 场景引入: 现在我 ...
- GitLab CI构建SpringBoot-2.3应用
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 【kinetic】操作系统探索总结(六)使用smartcar进行仿真
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify } a:link { color: r ...
- gcc/g++命令参数
在windows环境下,我们运行一程序,只需要在VS中点击运行按键即可,VS帮我们做完了程序的预处理.编译.汇编.链接阶段 但是在linux环境下,我们只能借助gcc/g++完成这一系列的操作 -o参 ...
- Centos7 编译安装PHP7.2
yum install wget 在 /usr/local/src 目录下载php源码包 wget http://cn2.php.net/distributions/php-7.2.4.tar.gz ...
- 坐标转换成SVG的path路径
大家好,我是一个刚入职的前端小白,入职后一直做关于svg 的东西,我将自以为很方便的方法提供给大家. function svgPathCurv(a,b,curv) { /* * 弯曲函数. * a:a ...
- java:原子类的CAS
当一个处理器想要更新某个变量的值时,向总线发出LOCK#信号,此时其他处理器的对该变量的操作请求将被阻塞,发出锁定信号的处理器将独占共享内存,于是更新就是原子性的了. 1.compareAndSet- ...
- maven项目pom.xml解析
- 风炫安全WEB安全学习第二十节课 反射型XSS讲解
风炫安全WEB安全学习第二十节课 反射型XSS讲解 反射性xss演示 原理讲解 如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞.通常,该页面会使用一个包含消息文本的参数, ...
- Mac Navicat premium 12 连接mysql8.0.21出现 'caching_sha2_password' 解决方案
1.通过命令 select user,plugin from user where user='root'; 我们可以发现加密方式是caching_sha2_password. 2. 修改查看加密方 ...