yii urlmanager配置post不生效_一文带你彻底学会 Git Hooks 配置

你好,我是小桔,是一个没有感情的代码崽。

今天给大家介绍一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,还有许多高级功能,Git Hooks 就是其中之一。

本文环境:

  • Git 版本:2.27.0
  • Husky 版本:4.2.5
  • Node.js 版本:12.16.2

前言

做过前端的同学对 Hook 这个东西应该很了解吧,后端也是有 Hook 这种概念的,比如 Java 的@PostConstruct,也是一种 Hook 的体现。简单来说,Hook 就是在执行某个事件之前或之后进行一些其他额外的操作

举个栗子,张三现在要吃饭,那么吃饭就是一个事件,吃饭前和吃饭后就可以称为两个钩子。现在你想让张三在吃饭前洗下手,那么我们就可以在吃饭前这个钩子这里,设置一个洗手的动作。张三在每次吃饭前,都会检查一下这个钩子,有什么要做的,都会照做。这样,就实现了我们的需求。

Git 也是如此,在 Git 中也有许多的事件(commit、push 等等),每个事件也是对应了有不同的钩子的(如 commit 前,commit 后),那么我们就可以在这些钩子这里配置一些自己需要执行的操作来实现各种各样的需求。

使用

真实场景

可能初次了解 Git Hooks 的同学会有一些疑问:这个东西到底能干嘛?我以前没用过它不也一样好好的吗?我干嘛要用它?

其实这说得很对,**任何技术都是有需求采用,没有需求就别去硬塞,永远记住:技术为业务服务。**但是这并不妨碍你先去了解它,毕竟,只有你先知道了这项技术能解决什么样的问题,日后当你遇到相应的问题时,你才知道该用什么技术去解决。

这里我给出一个真实的场景,是我们团队在开发 Lin UI 的时候遇到的:

我们的 Git 仓库中包含了编译后的代码,所以每次修改了源码,都需要运行一下编译命令,然后把源码和编译后的代码一起提交到 Git 仓库,这个流程没什么问题。但是,人脑不是电脑,总会有疏忽的时候,经常会出现这样一种情况:修改了源码,却忘记了运行编译命令,最后只把源码提交到了 Git 仓库,导致线上仓库的源码和编译产物不一致、

这个问题虽然不是特别严重,但老是出现也总归不好。所以我们就想了一个办法,不再手动编译,把编译任务交给 CI 去做,这样就不存在这样的问题。

但事情总是没那么顺利,因为我们在本地开发调试的时候是需要编译代码的,所以就会生成一部分编译代码,在使用 Git 时,我们经常会使用git add .命令,会把所有修改了的代码都提交到仓库,这显示是不行的。因为现在我们已经把编译交给 CI 去做了,并且为了 Code Review 方便,编译代码不应该再提交到仓库了。如果每次手动去把编译代码去除,又非常麻烦,那该怎么办呢?

这种情况,就可以使用 Git Hooks 帮我们在每次提交前自动把编译代码去掉了。

PS:这个场景虽然不那么常见和通用,但确实是在开发中真实遇见的。

Git Hooks 介绍

Git Hooks 的实现其实非常简单,就是就.git/hooks文件下,保存了一些 shell 脚本,然后在对应的钩子中执行这些脚本就行了。比如下图中,这是一个还没有配置 Git Hooks 的仓库,默认会有很多.sample结尾的文件,这些都是示例文件

2056987a70af77987b7d563c0d38716e.png

我们打开pre-commit.sample文件看一下其中的内容,大致意思是说这是一个示例,做了一些格式方面的检测,这个脚本默认是不生效的,如果要生效,把文件名改为pre-commit.sample即可

d3489965a0b2b4e51c4b22e031d18d24.png

pre-commit这个钩子是在git commit命令执行之前触发

Git 支持的所有钩子见下表(加粗的为常用钩子):

Git Hook调用时机说明
pre-applypatchgit am执行前
applypatch-msggit am执行前
post-applypatchgit am执行后不影响git am的结果
pre-commitgit commit执行前可以用git commit --no-verify绕过
commit-msggit commit执行前可以用git commit --no-verify绕过
post-commitgit commit执行后不影响git commit的结果
pre-merge-commitgit merge执行前可以用git merge --no-verify绕过。
prepare-commit-msggit commit执行后,编辑器打开之前
pre-rebasegit rebase执行前
post-checkoutgit checkoutgit switch执行后如果不使用--no-checkout参数,则在git clone之后也会执行。
post-mergegit commit执行后在执行git pull时也会被调用
pre-pushgit push执行前
pre-receivegit-receive-pack执行前
update
post-receivegit-receive-pack执行后不影响git-receive-pack的结果
post-updategit-receive-packgit push 作出反应并更新仓库中的引用时
push-to-checkout当``git-receive-packgit push做出反应并更新仓库中的引用时,以及当推送试图更新当前被签出的分支且receive.denyCurrentBranch配置被设置为updateInstead`时
pre-auto-gcgit gc --auto执行前
post-rewrite执行git commit --amendgit rebase
sendemail-validategit send-email执行前
fsmonitor-watchman配置core.fsmonitor被设置为.git/hooks/fsmonitor-watchman.git/hooks/fsmonitor-watchmanv2
p4-pre-submitgit-p4 submit执行前可以用git-p4 submit --no-verify绕过
p4-prepare-changelistgit-p4 submit执行后,编辑器启动前可以用git-p4 submit --no-verify绕过
p4-changelistgit-p4 submit执行并编辑完changelist message可以用git-p4 submit --no-verify绕过
p4-post-changelistgit-p4 submit执行后
post-index-change索引被写入到read-cache.c do_write_locked_index

PS:完整钩子说明,请参考官网链接

Husky 配置

从上面的介绍中,我们知道 Git Hook 保存在 .git 文件夹中。不知你有没有发现这会有一个问题?可能细心的同学已经知道了,Git 是一个多人协作工具,那按理说 Git 仓库中的所有文件都应该被跟踪并且上传至远程仓库的。但是有个例外,.git文件夹不会,这就导致一个问题,我们在本地配置好 Git Hook 后,怎么分享给其他小伙伴儿呢?copy 吗?那未免太 low 了,都用 Git 了,还 copy,也太不优雅了。这时候,就轮到 Husky 出场了。

Husky 是一个让配置 Git 钩子变得更简单的工具(题外话:Husky 是哈士奇的意思,我猜可能是作者养了条二哈)

下面这些流行的项目都在使用 Husky,可见它确实是一个非常好用的工具:

  • webpack
  • babel
  • create-react-app
  • ……

Husky 的原理是让我们在项目根目录中写一个配置文件,然后在安装 Husky的时候把配置文件和 Git Hook 关联起来,这样我们就能在团队中使用 Git Hook 了。

下面开始配置 Husky

第一步

使用 npm 初始化你的项目(如果项目已有 package.json,请跳至第二步)

npm init -y

第二步

安装 Husky

// 注意 Node.js 版本要 >=10
npm install husky -D

第三步

书写配置文件,4.2.5 版本的 Husky 共支持以下几种格式的配置文件:

  • .huskyrc
  • .huskyrc.json
  • .huskyrc.yaml
  • .huskyrc.yml
  • .huskyrc.js
  • husky.config.js

个人习惯,这里我采用的是.huskyrc,在其中书写 json 格式的配置,如下:

{
  "hooks": {
    "pre-commit": "git restore -W -S dist examples/dist"
  }
}

是不是很简单,我们来解读一下这个配置文件。hooks这个对象中,key 就是钩子名,而 value 就是需要执行的命令。上面这个配置的含义就是,在每次执行 git commit之前,都会把distexamples/dit目录下的修改回滚(这两个目录就是编译产生的代码),就不用担心误把编译后的代码提交到仓库中了。

上面我们只写了一条命令,如果想执行两条命令怎么办呢?比如我还想在git commit之前用 EsLint 检查一下代码质量,我们可以像下面这样写:

{
  "hooks": {
    "pre-commit": "git restore -W -S dist examples/dist && eslint ."
  }
}

是的,就是这么简单。如果 EsLint 检测不通过,那么git commit是会被阻止的,就不用担心"垃圾代码"被提交到线上仓库了。

Husky 注意事项

Husky 让我们可以很方便的配置 Git Hooks,同时,也提供了一些实用方便的小技巧以及一些我们需要注意的点

不支持的钩子

Husky 不支持服务端 Git 的钩子:

  • pre-receive
  • update
  • post-receive

跳过所有钩子

有时你可能不想运行钩子,那么可以像下面这样跳过:

HUSKY_SKIP_HOOKS=1 git rebase ...

禁用自动安装

如果你不想 Husky 为你自动安装钩子(比如 clone 了一个第三方的库,想要自己开发时),可以这样做:

HUSKY_SKIP_INSTALL=1 npm install

最后

本文介绍了 Git Hooks 具体有哪些,并讲解了如何用 Husky 便捷的配置 Git Hook。下一篇文章,我会教你如何用 commitlint 结合 Husky 来规范团队的 commit 信息,如果有兴趣的话,记得一定要关注我哦!

我是小桔,欢迎关注我的微信公众号,带你了解更多前后端知识。

49f860ea7cdd9621891e097ce8277241.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tiff – 值得你体验一下的可视化的字体对比工具

Tiff 是一款字体对比工具,可视化对比两种字体之间的差异。这是一个工具来帮助比较两种字体,同时学习排版。在这一点上,谷歌 Web 字体作为 Tiff 外部字体文件的唯一来源。由于应用程序使用的一些功能需要 HTML5 和 CSS3 支持,因此请…

[.NET] 建构子中传递子对象的对象

在设计对象继承的时候&#xff0c;父对象建构子会需要一些参数&#xff0c;这些参数可以由子对象建构子透过base关键词来提供。 namespace Test001 {public class ParentClass{// Constructorspublic ParentClass(IEnumerable<string> dataCollection){this.DataCollecti…

php基础教程(三):变量

1、php变量规则 变量以 $ 符号开头&#xff0c;其后是变量的名称变量名称必须以字母或下划线开头变量名称不能以数字开头变量名称只能包含字母数字字符和下划线&#xff08;A-z、0-9 以及 _&#xff09;变量名称对大小写敏感&#xff08;$y 与 $Y 是两个不同的变量&#xff09;…

操作系统实验文件管理_系统设计硬核知识(5)——操作系统的文件管理

操作系统对计算机的管理包括两个方面&#xff1a;硬件资源和软件资源。硬件资源的管理包括CPU 的管理、存储器的管理、设备管理等&#xff0c;主要解决硬件资源的有效和合理利用问题。软件资源包括各种系统程序、各种应用程序、各种用户程序&#xff0c;也包括大量的文档材料、…

错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据

数据库导入导出时总失败&#xff0c;错误信息如下&#xff1a; 正在验证 (错误) 消息错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据。 (SQL Server 导入和导出向导) 错误 0xc0202045: 数据流任务 1: 验证列元数据失败。 (SQL Server 导入和导出向导) 错误 0xc0…

python中的items方法_Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】...

今天爱分享给大家带来Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】&#xff0c;希望能够帮助到大家。 字典是 Python 语言中唯一的映射类型。映射类型对象里哈希键(键&#xff0c;key)和指向的对象&#xff08;值&#xff0c;value)是多对一的关系&am…

大网高级技术笔记(一)

防伪码&#xff1b;黑发不知勤学早&#xff0c;白首方悔读书迟本章目标&#xff1a;理解消化动态路由协议与OSPF协议并应用于实际工作中。第一章 动态路由协议一、按照路由执行的算法分类距离矢量路由协议&#xff1a;RIP、IGRP链路状态路由协议&#xff1a;OSPE、IS-IS二、RIP…

容器类基础篇(一)

容器类&#xff1a;用来解决数组具有固定尺寸而使得灵活性受限的问题。基本的容器类&#xff08;集合类&#xff09;有&#xff1a;List、Set、Queue、Map。 Java容器类类库的用途是用来“保存对象”&#xff0c;这分为两个不同的大类&#xff1a; 1.Collection&#xff08;集合…

阿里MySQL读写一致_阿里面试题:如何保证缓存与数据库的双写一致性?

作者&#xff1a;你是我的海啸出处&#xff1a;https://blog.csdn.net/chang384915878/article/details/86756463只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性…

反射小应用之DataTable和ListT互操作

反射小应用之DataTable和List<T>互操作 在程序中&#xff0c;往往会遇到一些小情况&#xff0c;就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中&#xff0c;这样做的一个后果是在日后的的对数据进行”细“操作时&#xff0c;就发现它可能没有L…

python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?

原标题&#xff1a;什么样的人比较适合选择Python开发人工智能技术&#xff1f; 互联网行业最近几年来确实成为了竞相追捧的行业&#xff0c;人工智能、大数据的不断发展让Python开发技术成为了继Java开发之后的又一热门编程语言。我们都知道&#xff0c;想要学习Python开发编程…

java 8 方法引用(method references)

1 什么是方法引用&#xff08;method references&#xff09;java 8 添加了一个很熟悉但是又很陌生的符号::。 你也许会看到这样的代码System.out::println其实就是方法引用&#xff08;method references&#xff09;。由于java 8 把方法/函数也作为第一输入参数。所以你会看到…

SWT中Button事件的几种不同写法

1&#xff0e;匿名内部类写法button.addSelectionListener(new SelectionAdapter(){Overridepublic void widgetSelected(SelectionEvent e){.....}});释&#xff1a;当button被单击时&#xff0c;底层就会检查button是否注册了相对就的监听器&#xff0c;如果有&#xff0c;底…

python中fetchall函数_python中查询数据库时fetchone()函数和fetchall()函数的区别

我们在用python操作数据库的时候,经常会碰见两个函数:fetchone()和fetchall()刚开始学习的时候可能会搞不清楚他们两个的区别其实非常简单首先fetchone()函数它的返回值是单个的元组,也就是一行记录,如果没有结果,那就会返回null其次是fetchall()函数,它的返回值是多个元组,即返…

文字对齐格式

text-align:justify; letter-spacing:5px; line-height:40px; text-indent:40px 转载于:https://www.cnblogs.com/mrcln/p/3757148.html

excel vba 从入门到精通_VBA词汇-基本元素篇

在公众号发布学习VBA需要哪些基础知识这篇文章后&#xff0c;有朋友给我们留言&#xff0c;希望可以出一份VBA基础的英语知识贴。其实相关的内容我们会在后面所对应知识点一一进行讲解&#xff0c;提前剧透其实会少很多学习未知知识的乐趣哦~ 我们会将所涉及的基础单词和其说明…

jQuery基础:remove()与 detach()区别

1、detach&#xff08;&#xff09; detach() 方法移除被选元素&#xff0c;包括所有文本和子节点。这个方法会保留 jQuery 对象中的匹配的元素&#xff0c;因而可以在将来再使用这些匹配的元素。detach() 会保留所有绑定的事件、附加的数据&#xff0c;这一点与 remove() 不同…

python保存模型 特征_Pytorch提取模型特征向量保存至csv的例子

Pytorch提取模型特征向量# -*- coding: utf-8 -*-"""dj"""import torchimport torch.nn as nnimport osfrom torchvision import models, transformsfrom torch.autograd import Variableimport numpy as npfrom PIL import Imageimport torchvi…

Matlab画图-非常具体,非常全面

Matlab画图 强大的画图功能是Matlab的特点之中的一个&#xff0c;Matlab提供了一系列的画图函数&#xff0c;用户不须要过多的考虑画图的细节&#xff0c;仅仅须要给出一些基本參数就能得到所需图形&#xff0c;这类函数称为高层画图函数。此外&#xff0c;Matlab还提供了直接对…

openfeign使用_Feign使用基于配置服务发现

之前写了篇《Feign在实际项目中的应用实践总结》Feign在实际项目中的应用实践总结 - 沐风之境 - 博客园​www.cnblogs.com总结了在一般项目中如何使用Feign这个提升开发效率的利器。最近在看Feign的文档的时候发现了之前遗漏的一些点&#xff0c;所以写了这篇文章进行补充。pom…