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官网

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

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

相关文章

Find My游戏手柄|苹果Find My技术与手柄结合,智能防丢,全球定位

游戏手柄是一种常见电子游戏机的部件,通过操纵其按钮等,实现对游戏虚拟角色的控制。随着游戏设备硬件的升级换代,现代游戏手柄又增加了:类比摇杆(方向及视角),扳机键以及HOME菜单键等。现在的游…

2024年实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

字符串最后一个单词的长度【C语言】

【华为机试题 HJ1】 字符串最后一个单词的长度 描述输入描述:输出描述:示例1参考代码1背景知识点 ```scanf("%s", u8Str) != EOF```参考代码2参考代码 不使用 strlen()描述 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不…

Postman接口测试神器从安装到精通

Postman 的优点: 支持各种的请求类型: get、post、put、patch、delete 等支持在线存储数据,通过账号就可以进行迁移数据很方便的支持请求 header 和请求参数的设置支持不同的认证机制,包括 Basic Auth,Digest Auth,OAu…

gitlab部署

系统版本 [rootlocalhost ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 9.1 (Plow)gitlab包位置 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ee/yum/el9/gitlab-ee-16.7.2-ee.0.el9.x86_64.rpm关闭防火墙 [rootlocalhost data]# systemctl stop firew…

使用 Docker 部署 Halo 博客系统

:::info 项目地址:https://github.com/halo-dev/halo ::: 一、Halo 介绍 1)Halo 简介 Halo 是一款强大易用的开源建站工具,它让你无需太多的技术知识就可以快速搭建一个博客、网站或者内容管理系统。具备可插拔架构、主题套用、富文本编辑器…

Hive数据定义(1)

hive数据定义是hive的基础知识,所包含的知识点有:数据仓库的创建、数据仓库的查询、数据仓库的修改、数据仓库的删除、表的创建、表的删除、表的修改、内部表、外部表、分区表、桶表、表的修改、视图。本篇文章先介绍:数据仓库的创建、数据仓…

CCF模拟题 202305-1 重复局面

试题编号: 202305-1 试题名称: 重复局面 时间限制: 1.0s 内存限制: 512.0MB 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3次以上,可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以用…

Postman接口测试工具最全实用教程

一、postman简介 1、postman的特点 postman只做http协议的接口的测试,是一种最广泛REST接口测试客户端软件。postman支持http协议的所有请求方式,包括get、post、head、put、delete等。postman支持各种额外的头部字段的添加。postman除了可以模拟普通表…

C语言快速排序——qsort函数

上面的是我们标准C语言库里面对qsort函数的介绍,我们先来从排序说起: 这就不得不提出编程中最最基础的排序算法---冒泡排序 对于一个任意的无序数列,我们如果想要把他排成顺序数列的话,我们就可以让每一项跟后面的一项去比较&…

【设计模式】builder 创建者设计模式详解(包含电商应用场景及代码示例)

一、builder 简介 在常见的设计模式中,“Builder” 通常是指一种设计模式,而不是具体的类或方法。Builder 模式是一种创建型设计模式,其目的是通过提供一个独立的构建器类来构建一个复杂对象。 建造者模式(Builder Pattern&…

大模型在游戏行业的应用分析

文章目录 一、大模型作用1)节省美术成本2)模仿用户肖像,精准投放3)买量流程的自动化4)缩短视频素材制作周期5)例如新营销形式宣传(图生图)5)故事设计6)辅助代…

figma导入psd实战笔记

最近发现figma特别好用 并且插件生态特别庞大 如 将设计图转成vue react react-native 项目 flutter 项目 最重要的是 可以集成vscode 插件使用 使用蓝湖久了 感觉蓝湖 有写繁琐 同事扩展功能有限 Figma: The Collaborative Interface Design ToolFigma is the leading collabo…

欧拉函数算法总结

知识概览 欧拉函数为1~n中与n互质的数的个数。假设一个数N分解质因数后的结果为 则欧拉函数 这可以用容斥原理来证明。 欧拉函数的应用 欧拉定理:若a与n互质,则。 费马小定理:欧拉定理中的n为质数p时,可以得到若a与p互质&#xff…

深入理解计算机系统(2):信息的表示和处理

信息存储 大多数计算机使用 8 位的块,或者字节(byte),作为最小的可寻址的内存单位,而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组,称为虚拟内存(virtual memory)。内存的每个字节都由一个唯一的数字来标识…

vcruntime140_1.dll无法继续执行代码怎么办?6个修复方法分享

找不到vcruntime1401.dll”。这个错误提示通常意味着我们的计算机缺少了一个重要的动态链接库文件。本文将介绍vcruntime1401.dll是什么文件、它的作用以及当电脑丢失该文件时可能产生的影响,并提供6个解决方法来解决这个问题。 一、vcruntime1401.dll是什么文件&a…

Linux指令(一)

今天来学习Linux的一些基本的指令。 今天要学习的指令有ls,pwd,mkdir,cd,touch,rm等。 指令的格式 在Linux中,指令的语法通常遵循以下格式: command [options] [arguments] command 是要执行…

便捷特惠的快递寄件快递物流折扣平台 ,通常都有什么常见问题?

首先,最重要的一点是怎么寄快递更便宜? 我们在寄快递时,尽量把包裹压缩空间大一点,这样在体积上面就会减少一部分的费用呢,另外就是选择有优惠的平台下单。例如在闪侠惠递平台下单,单单打折,单…

AC修炼计划(AtCoder Beginner Contest 335)A-F

传送门: AtCoder Beginner Contest 335 (Sponsored by Mynavi) - AtCoder A,B,C,D还算比较基础,没有什么思路,纯暴力就可以过。 这里来总结一下E和F E - Non-Decreasing Colorful Path 最开始以为是树形…

终于学会听英文歌了:Because of You

作词 : Ben Moody/David hodges/Kelly Clarkson 作曲 : Ben Moody/David hodges/Kelly Clarkson I will not make the same mistakes that you did 我不會 重蹈你的覆轍 I will not let myself cause my heart so much misery 我不會 讓我自己心煩憂苦 I will not break the wa…