当前位置: 首页 > news >正文

git hooks

介绍

当我们在执行git管理仓库代码时,想规范下每个用户的commit内容?想检查下提交的代码规范?想检查下PR是否通过,那么这个时候就需要用到git hooks,git hooks可以在我们进行git操作的关键时机插入我们想要执行的“脚本文件”。

git的hooks按照环境分客户端侧(client-side)和服务端侧(server-side)。客户端侧的hook主要用于提交git commit和合并merge命令,而服务端侧的hook主要用于接收push等操作。

git的hooks是有本地执行的脚本语言写成的,默认时Shell Script,当然也可以是Ruby、Python等。

客户端的hooks

每一个Git repo下都有一个.git/hooks的目录(本地和远程均有,通常不加入到git管理),其内容就是放置hooks的位置。我们自定义hook的话,就是放置在这个目录下,当我们在本地触发git操作时,相应的hook就会被执行。

客户端 git hooks 全貌
客户端 hooks 分类git hooksgit hooks 执行时机
commit hooks(git commit触发)pre-commitgit commit执行前
commit-msggit commit 执行前
prepare-commit-msggit commit 执行后,编辑器打开前
post-commitgit commit 执行后
e-mail hooks(git am触发)applypatch-msggit am 执行前
pre-applypatchgit am 执行前
post-applypatchgit am 执行后
其他 hookspre-rebase git rebase 命令之前
post-checkout git checkout 、git clone均可触发,在工作区更新之后执行
post-merge git merge 调用在merge成功后执行
commit hooks
  • *pre-commit
    pre-commit是最先触发运行的脚本。在提交一个commit之前,该hook有能力做许多工作,比如检查待提交东西的快照,以确保这份提交中没有缺少什么东西、文件名是否符合规范、是否对这份提交进行了测试、代码风格是否符合团队要求等等。 这个脚本可以通过传递--no-verify参数而禁用,如果脚本运行失败(返回非零值),git提交就会被终止。

  • *commit-msg
    commit-msg包含有一个参数,用来规定提交说明文件的路径。 该脚本可以用来验证提交说明的规范性,如果作者写的提交说明不符合指定路径文件中的规范,提交就会被终止。 该脚本可以通过传递–no-verify参数而禁用,如果脚本运行失败(返回非零值),git提交就会被终止。

  • *prepare-commit-msg
    prepare-commit-msg脚本会在默认的提交信息准备完成后但编辑器尚未启动之前运行。 这个脚本的作用是用来编辑commit的默认提交说明。 该脚本有1~3个参数:包含提交说明文件的路径,commit类型(message, template, merge, squash),一个用于commit的SHA1值。这个脚本用的机会不是太多,主要是用于能自动生成commit message的情况。 该不会因为--no-verify参数而禁用,如果脚本运行失败(返回非零值),git提交就会被终止。

  • *post-commit
    post-commit脚本发生在整个提交过程完成之后。这个脚本不包含任何参数,也不会影响commit的运行结果,可以用于发送new commit通知。

e-mail hooks
  • *applypatch-msg
    applypatch-msg脚本最先被触发,它包含一个参数,用来规定提交说明文件的路径。该脚本可以修改文件中保存的提交说明,以便规范提交说明以符合项目标准。如果提交说明不符合规定的标准,脚本返回非零值,git终止提交。

说明一点,这个脚本看上去和commit-msg作用几乎一样。没错,默认情况下该脚本是这样写的:
  ![[Pasted image 20240111191843.png]]
也就是说,该脚本会调用commit-msg并执行。实际上,这一切都是可修改的。

pre-applypatch
pre-applypatch会在补丁应用后但尚未提交前运行。这个脚本没有参数,可以用于对应用补丁后的工作区进行测试,或对git tree进行检查。如果不能通过测试或检查,脚本返回非零值,git终止提交。 同样需要注意,git提供的此默认脚本中只是简单调用了pre-commit,因此在实际工作中需要视情况修改。

post-applypatch
post-applypatch脚本会在补丁应用并提交之后运行,它不包含参数,也不会影响git am的运行结果。该脚本可以用来向工作组成员或补丁作者发送通知。

其他hooks

pre-rebase
由git rebase命令调用,运行在rebase执行之前,可以用来阻止任何已发发生过的提交参与变基(字面意思,找不到合适的词汇了)。默认的pre-rebase确实是这么做的,不过脚本中的next是根据Git项目自身而写的分支名,在使用过程中应该将其改成自己的稳定分支名称。

post-checkout
由git checkout命令调用,在完成工作区更新之后执行。该脚本由三个参数:之前HEAD指向的引用,新的HEAD指向的引用,一个用于标识此次检出是否是分支检出的值(0表示文件检出,1表示分支检出)。
也可以被git clone触发调用,除非在克隆时使用参数–no-checkout。在由clone调用执行时,三个参数分别为null, 1, 1。
这个脚本可以用于为自己的项目设置合适的工作区,比如自动生成文档、移动一些大型二进制文件等,也可以用于检查版本库的有效性。

post-merge
由git merge调用,在merge成功后执行。该脚本有一个参数,标识合并是否为压缩合并。该脚本可以用于对一些Git无法记录的数据的恢复,比如文件权限、属主、ACL等。

服务端 hooks

除了本地执行的Hooks脚本之外,还有一些放在Git Server上的Hooks脚本,作为管理员,可以利用这些服务端的脚本来强制确保项目的任何规范。这些运行在服务端的脚本,会在push命令发生的前后执行。pre系列的脚本可以在任何时候返回非零值来终止某次push,并向push方返回一个错误说明。

hook 名说明
pre-receivegit-receive-pack 执行前
post-receivegit receive-pack执行后
updategit receive-pack执行后
  

pre-receive
由服务器端的git receive-pack命令调用,当从本地版本库完成一个推送之后,远端服务器开始批量更新之前,该脚本被触发执行。该脚本会从标准输入中读入一连串push过来的引用,如果这里面存在任何非零值,这批更新将不会被服务器接受。可以利用这个脚本来检查推送过来的提交是否合法。

post-receive
由服务器端的gir receive-pack命令调用,当从本地版本库完成一个推送,并且在远程服务器上所有引用都更新完毕后执行。该脚本可以用于对其他镜像版本库的更新,或向用户发送提示(直接通过服务器端的echo命令)。如上文我提到的利用Git实现生产代码的自动化部署,就可以通过这个脚本完成。

update 这是一个强大的hook脚本。它和pre-recieve有些类似,只是它会为推送过来的更新中涉及到的每一个分支都做一次检查,而后者则至始至终只有一次检查。另外,它不是从标准输入中读取数据,而是包含三个参数:

  • 要更新的引用或分支的名称
  • 引用中保存的旧对象名称(SHA1)
  • 将要保存到引用中的新对象名称(SHA1)
    如果检查到返回非零值,之后返回非零值的引用会被拒绝,其他正常的引用更新都会被接受。除此之外,该脚本还可以用来防止引用被强制更新,因为它可以通过这些参数来检查新旧引用对象中是否存在继承关系,从而提供更细致的推送授权。

参考资料

git hooks官网

相关文章:

git hooks

介绍 当我们在执行git管理仓库代码时,想规范下每个用户的commit内容?想检查下提交的代码规范?想检查下PR是否通过,那么这个时候就需要用到git hooks,git hooks可以在我们进行git操作的关键时机插入我们想要执行的“脚…...

法规更新美国玩具标准ASTM F963-17有更新,最新标准为ASTM F963-23

美国材料试验协会 (ASTM)在10月13日发布了新的玩具安全标准:ASTM F963-23,ASTM F963-17美国联邦法规16 CFR 1250还在使用当中,出口美国的玩具的厂商要引起重视。 ASTM F963-17是什么标准? ASTM F963-17是美国玩具检测标准&#…...

【grpc】利用protobuf实现java或kotlin调用python脚本,含实现过程和全部代码

前言 在一些特殊场景中,我们可能需要使用java或者其他任意语言调用python脚本或sdk等。本文的需求衍生也不例外于此,python端有sdk,但只能在python中调用,于是就有了本文章。 常见的调用方式如jython、python提供http rest接口、…...

Linux网络 ----- 网络文件共享服务之FTP服务

引言 FTP服务是Internet上最早应用于主机之间进行数据传输的基本服务之一。是目前Internet上使用最广泛的文件传送协议 一、FTP概述 FTP(File TransferProtocol,文件传输协议)是典型的C/S架构的应用层协议,需要由服务端软件、客户端软件两个部分共同实…...

如何避免知识付费小程序平台的陷阱?搭建平台的最佳实践

随着知识经济的兴起,知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现,而知识付费小程序平台则成为了一个重要的渠道。然而,市面上的知识付费小程序平台琳琅满目,其中不乏一些不良平台,让老实人…...

第89讲:MySQL数据库迁移方面需要考虑的因素以及XBK企业级备份参数

文章目录 MySQL数据库迁移方面需要考虑的因素1.MySQL数据库迁移方面要考虑的因素2.MySQL5.6升级到5.7版本的方法3.MySQL迁移到其他数据库的方法4.为什么要从XBK备份中还原某张表的数据5.从XBK备份中还原某张表的数据6.XtrBackup企业级备份参数 MySQL数据库迁移方面需要考虑的因…...

Python爬虫经典实战项目——电商数据爬取!

电商数据采集爬虫背景 在如今这个网购风云从不间歇的时代,购物狂欢持续不断,一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时,“如何省钱?”成为了大家最关心的问题。 比价、返利、优…...

Qt 快捷键设置

以 “在编辑时自动补齐”快捷键 为例: 位置:红色 搜索快捷键:蓝色 修改方式:绿色 快捷键:黄色...

【C++】取整函数ceil(),floor(),round()

使用 //引入头文件 #include <cmath> //函数使用 double around(double x) double afloor(double x) double aceil(double x) 结果取值 floor(x) 返回是小于或等于x的最大整数&#xff0c;如floor(-9.9)-10,floor(9.9)9&#xff1b;若为整数&#xff0c;最后的结果等于本…...

GoLang刷题之leetcode

题目42&#xff1a;接雨水 题目描述&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水 题解&#xff1a; 对于每一个横坐标能接到的雨水量max&#xff08;左侧最大纵坐标&#xff0c;右侧最大…...

uniapp如何分包加载

在uni-app中&#xff0c;可以通过配置manifest.json文件来实现分包加载。以下是具体操作步骤&#xff1a; 在项目根目录下找到并打开manifest.json文件。在"uni-app"节点中&#xff0c;找到并修改"subPackages"节点&#xff0c;添加需要分包的页面路径。 …...

019、错误处理:不可恢复错误与panic!

鉴于上一篇文章过长&#xff0c;不方便大家阅读和理解&#xff0c;因此关于Rust中的错误处理&#xff0c; 我将分以下3篇来讲。 另外&#xff0c;随着我们学习的不断深入&#xff0c;难度也会越来越大&#xff0c;但不用担心。接下来只需要让自己的脚步慢一些&#xff0c;认真搞…...

jar包部署到linux虚拟机的docker中之后连不上mysql

前言&#xff1a; 跟着黑马学习docker的时候&#xff0c;将java项目部署到了docker中&#xff0c;运行访问报错&#xff0c;反馈连不上mysql。 错误描述&#xff1a; 方法解决&#xff1a; 概述&#xff1a;在虚拟中中&#xff0c;我进入项目容器的内部&#xff0c;尝试ping…...

如何筛选小红书护肤达人,笔记类型怎么选?

网络时代&#xff0c;借助KOL来放大产品的声量和产量&#xff0c;是品牌的常见策略&#xff0c;但是&#xff0c;不同的产品对应不同的KOL&#xff0c;价值是完全不一样。如何筛选达人&#xff0c;已经成为了品牌方的必修课!今天我们和大家分享下如何筛选小红书护肤达人&#x…...

红黑树(RBTree)

目录​​​​​​​ 一、红黑树简介 二、红黑树的来源 三、什么是红黑树 四、红黑树的性质 五、红黑树的节点定义 六、红黑树的操作 6.1、红黑树的查找 6.2、红黑树的插入 七、红黑树的验证 八、红黑树和AVL树的比较 一、红黑树简介 红黑树是一种自平衡的二叉查找树…...

训练YOLOS-S

文章目录 1 数据处理2 配置训练参数3 可能会遇到的报错 1 数据处理 修改类别数&#xff1a;在models/detector.py中定位到def build(args):&#xff0c;将num_classes进行修改&#xff0c;改为最大的类别id1。我有4个类别&#xff0c;类别id是从0~3&#xff0c;因此max_id3&am…...

集成SpringCloudAlibaba短信服务 短信验证码

1.1 SpringCloudAlibaba短信服务简介 短信服务&#xff08;Short Message Service&#xff09;是阿里云为用户提供的一种通信服务的能力。 产品优势&#xff1a;覆盖全面、高并发处理、消息堆积处理、开发管理简单、智能监控调度 产品功能&#xff1a;短信通知、短信验证码、…...

存储卷(数据卷)—主要是nfs方式挂载

1、定义 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;一旦容器被删除&#xff0c;数据会丢失。k8s基于控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态会恢复到原始状态。一旦回到原始状态&#xff0c;后天编辑的文件…...

城市酷选模式开发(门店免单排队返利系统)

城市酷选模式开发&#xff08;门店免单排队返利系统&#xff09;【阿巴】城市酷选商城开发免单排队返利小程序搭建、城市酷选模式开发、城市酷选系统商城开发、城市酷选APP系统开发、城市酷选 每经AI快讯&#xff0c;有投资者在投资者互动平台提问&#xff1a;“以塑代钢”已成…...

JNPF低代码引擎到底是什么?

最近听说一款可以免费部署本地进行试用的低代码引擎&#xff0c;源码上支持100%源码&#xff0c;提供的功能和技术支持比较完善。借助这篇篇幅我们了解下JNPF到底是什么&#xff1f; JNPF开发平台是一款PaaS服务为核心的零代码开发平台&#xff0c;平台提供了多租户账号管理、主…...

GTE多任务NLP引擎部署教程:离线环境下的安装、配置与测试

GTE多任务NLP引擎部署教程&#xff1a;离线环境下的安装、配置与测试 1. 环境准备与快速部署 1.1 系统要求与依赖检查 在开始部署前&#xff0c;请确保您的离线服务器满足以下最低要求&#xff1a; 操作系统&#xff1a;Ubuntu 20.04/22.04 或 CentOS 7/8&#xff08;推荐&…...

Qwen3-0.6B入门实战:从镜像启动到智能问答,完整流程解析

Qwen3-0.6B入门实战&#xff1a;从镜像启动到智能问答&#xff0c;完整流程解析 1. Qwen3-0.6B简介 Qwen3&#xff08;千问3&#xff09;是阿里巴巴集团开源的新一代通义千问大语言模型系列&#xff0c;涵盖6款密集模型和2款混合专家&#xff08;MoE&#xff09;架构模型。Qw…...

创建使用费曼学习技能,让 AI 帮你快速学习新领域知识(实战教程)

看完一篇文章、学习一个知识&#xff0c;当时感觉懂了。过三天&#xff0c;有人问你&#xff0c;你发现说不清楚。又或者准备运用这个知识&#xff0c;尝试解决问题&#xff0c;又觉得似是而非。这不是记忆力的问题&#xff0c;是你从来没有真正理解过它。有个方法专门解决这件…...

MGeo地址结构化实战:对接RPA机器人自动填写政务表格中的标准地址字段

MGeo地址结构化实战&#xff1a;对接RPA机器人自动填写政务表格中的标准地址字段 1. 引言&#xff1a;当RPA机器人遇上“不标准”的地址 想象一下这个场景&#xff1a;你是一家政务服务中心的技术负责人&#xff0c;每天有成百上千份表格需要处理。其中&#xff0c;地址信息填…...

YOLO X Layout在新闻行业的应用:版面自动排版

YOLO X Layout在新闻行业的应用&#xff1a;版面自动排版 每天清晨&#xff0c;当大多数人还在睡梦中时&#xff0c;新闻编辑部的排版编辑已经开始了一天中最紧张的工作&#xff1a;将记者们连夜赶制的稿件、摄影师捕捉的精彩瞬间、设计师制作的图表&#xff0c;精准地排列在有…...

工业数智化改造避坑:拒绝通用模板,定制化才是最优解

在工业数智化转型浪潮中&#xff0c;不少企业陷入了“投入与回报失衡”的困境&#xff1a;耗费大量资金、人力上线的数智化系统&#xff0c;却因与自身业务脱节、流程适配性差&#xff0c;难以发挥实际价值&#xff0c;最终沦为“摆设”。事实上&#xff0c;工业数智化改造的核…...

MCP协议实战:用npx免安装部署文件系统服务的完整指南

MCP协议实战&#xff1a;用npx免安装部署文件系统服务的完整指南 在当今快速迭代的开发环境中&#xff0c;如何高效部署和管理文件系统服务成为许多开发者面临的挑战。传统方式往往需要全局安装各种工具包&#xff0c;不仅占用系统资源&#xff0c;还可能引发版本冲突。本文将带…...

Frappe-Gantt 甘特图进阶实战:从核心功能到企业级定制

1. Frappe-Gantt 甘特图在企业级项目中的核心价值 第一次接触Frappe-Gantt是在去年一个跨部门协作的电商大促项目中。当时我们需要一个能直观展示各环节时间节点的工具&#xff0c;试过几个商业软件后&#xff0c;最终选择了这个开源的轻量级解决方案。它最吸引我的地方在于——…...

从设计到上线:基于快马平台开发一个具备完整功能的qclaw官网实战指南

从设计到上线&#xff1a;基于快马平台开发一个具备完整功能的qclaw官网实战指南 最近接手了一个qclaw官网的开发需求&#xff0c;需要从零开始构建一个具备完整功能的官方网站。经过调研&#xff0c;我选择了InsCode(快马)平台作为开发环境&#xff0c;因为它不仅提供了完整的…...

镜像视界|AI空间计算重塑公安实战:从“找人”到“锁人”的智能体革命——基于Pixel-to-Space、MatrixFusion与三维轨迹建模的空间级无感定位系统

&#x1f4d8; 镜像视界&#xff5c;AI空间计算重塑公安实战&#xff1a;从“找人”到“锁人”的智能体革命 ——基于Pixel-to-Space、MatrixFusion与三维轨迹建模的空间级无感定位系统 一、实战痛点&#xff1a;为什么公安仍停留在“找人阶段” 在当前公安实战中&#xff0c…...