git hook

news2024/11/19 23:28:03

hook

hook 翻译为钩子,简单说就是监听某个事件(操作),然后触发自定义逻辑
在 git 中可以监听 commit,push 等操作,在操作之前或之后触发对应的 hook,在 hook 中写自定义的逻辑,比如在提交之前做一些检查,检查未通过不允许提交

下面这些是 git hook 触发的时机

在这里插入图片描述
其中蓝色方块是某些操作之后触发,它不会阻塞操作,就是执行一些额外的操作
黄色和红色方块是某些操作之前触发,可以做一些检查,不满足条件会阻塞操作,区别在于黄色方块的操作可以跳过

克隆一个仓库并显示隐藏的文件,可以看到仓库根目录下的 .git 文件夹中有提供了一些 hook 例子,这些 hook 默认不生效,去掉 .sample 后缀才会生效
在这里插入图片描述
这些 hook 都是用 shell 命令编写的,查看 pre-commit

if git rev-parse --verify HEAD >/dev/null 2>&1
then
	against=HEAD
else
	against=$(git hash-object -t tree /dev/null)
fi

allownonascii=$(git config --type=bool hooks.allownonascii)

exec 1>&2

if [ "$allownonascii" != "true" ] &&
	test $(git diff --cached --name-only --diff-filter=A -z $against |
	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
	cat <<\EOF
Error: Attempt to add a non-ASCII file name.
This can cause problems if you want to work with people on other platforms.
To be portable it is advisable to rename the file.
If you know what you are doing you can disable this check using:
  git config hooks.allownonascii true
EOF
	exit 1
fi

exec git diff-index --check --cached $against --

它会检查提交的文件名里是否有非 ASCII 码,exit 1 表示检查没有通过,exit 0 表示检查通过
这些 hook 我们可以修改逻辑,但是它只会在本地生效,因为 .git 文件夹里的修改不会上传到仓库,为了参与项目的人都能使用 hook,需要借助第三方工具来实现

commitlint + husky

首选需要安装 node.js,官网下载安装即可
在项目根目录安装

npm install --save-dev @commitlint/cli @commitlint/config-conventional

安装 commitlint/cli 和 commitlint/config-conventional 这两个包,并将其添加到 devDependencies(开发阶段的依赖,就是我们在开发过程中需要用的依赖,只在开发阶段起作用的),并将该信息保存到 package.json中

commitlint/cli 是一个命令行工具,用于校验 Git 提交信息的格式是否符合规范。
commitlint/config-conventional 是一个常用的配置文件,它定义了一些常见的 Git 提交信息规范,例如 Angular 的规范。它包含了一些预定义的规则,可以直接使用,也支持自定义规则

新建 commitlint.config.js 文件,增加配置项

module.exports = {
  // 继承的规则
  extends: ['@commitlint/config-conventional'],
  // 定义规则类型
  rules: {
    // type 类型定义,表示 git 提交的 type 必须在以下类型范围内
    'type-enum': [
      2,
      'always',
      [
        'feat', // 新功能 feature
        'fix', // 修复 bug
        'docs', // 文档注释
        'style', // 代码格式(不影响代码运行的变动)
        'refactor', // 重构(既不增加新功能,也不是修复bug)
        'perf', // 性能优化
        'test', // 增加测试
        'chore', // 构建过程或辅助工具的变动
        'revert', // 回退
        'build' // 打包
      ]
    ],
    // subject 大小写不做校验
    'subject-case': [0]
  }
}

rule由name和配置数组组成,如上面的:‘type-enum:[2, ‘always’, […]]’,数组中第一位为level,可选0,1,2,0为disable,1为warning,2为error,这里的 2 表示错误级别,表示如果提交消息不符合规则,将会以错误级别报错,第二位为应用与否,可选 always|never,always 表示规则必须被应用到每一个提交消息中,第三位该rule的值,这里定义了 git 提交的类型,提交信息的开头必须是上面定义的类型,如

fix: 修复了某个bug

安装 husky

npm install husky --save-dev

在 package.json 中添加 prepare 脚本并运行,创建 .husky 文件夹

npm pkg set scripts.prepare="husky install"
npm run prepare

将一个名为 pre-commit 的 git hook 添加到 .husky 目录中

npx husky add .husky/pre-commit "npm test"

这里的 “npm test” 是 hook 中的指令,生成后可以随意修改,比如检查文件的名称,路径是否合法

添加一个 commit-msg 钩子,它会在每次提交代码时运行 commitlint,以确保提交的消息符合规范

npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

修改文件做测试
在这里插入图片描述
提交信息的开头包含必须是配置中定义的类型(feat,fix等)才能提交

在这里插入图片描述
最后把生成的这些文件提交到仓库,参与项目的人提交时都会受到在 hook 中做检查

使用 hook 实现主仓库和子模块的联动操作

子模块

子模块相当于子仓库,就是把一个 git 仓库作为另一个 git 仓库的子仓库

git submodule add https://gitee.com/xxx/sub1.git

在仓库下执行 git submodule add url(仓库地址),就会添加一个子模块,这时会生成 .gitmodules 和 一个子模块的文件夹,.gitmodules 中记录子模块的路径和仓库地址

[submodule "sub1"]
	path = sub1
	url = https://gitee.com/xxx/sub1.git

初始化所有的子仓库并更新

git submodule update --init --recursive

修改提交后,在主仓库可以看到子模块后面有个commit hash 值,这对应子模块的某一个版本
在这里插入图片描述
当我们克隆一个包含子模块的仓库时,它默认是不生成子模块的内容,需要递归的方式克隆整个项目才行

git clone url --recursive

或者克隆的时候勾选 Recursive

在这里插入图片描述

联动

为了让主仓库更新时,子模块也更新,在 .husky 文件夹下添加一个新的 post-merge 这个 hook,使用 git pull 更新后会触发 post-merge,因为 git pull 就是 git fetch 和 git merge 的简写,在 post-merge 里更新子模块

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# git pull 触发 merge 操作,更新所有子仓库
git submodule foreach 'git pull'

exit 0

如果子模块有更新,主仓库没有更新,此时执行 git pull 不会触发 post-merge,因为没有发生 merge 操作

如果需要主仓库切分支时,子模块也切分支,需要添加 post-checkout 这个 hook。
在执行 git clone 和 git checkout 后会触发 post-checkout,在克隆仓库或切分支后,会检查是否有子模块,有就初始化子模块,主仓库切分支后,如果这个分支名称是dev开头,子模块也会切过去

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

## $1是HEAD的前一个SHA值,$2是HEAD的当前SHA值。如果$1和$2相同,表示没有切换分支
if [ "$1" = "$2" ]; then
  exit 0
fi

# git clone 也会触发 post-checkout
# 存在子模块且未初始化,则初始化并更新
if [ -f .gitmodules ]; then
  if git submodule status | grep -q '^[-]'; then
    git submodule update --init --recursive --remote --merge
  fi
else
  exit 0
fi

branch=$(git branch --show-current)
#echo "branch-name: $branch"
# branch为空跳过
if [ -z "$branch" ]; then
  exit 0
fi

#如果分支名以dev开头,子模块也切过去,没有对应分支则创建分支并切过去
if [[ $branch == dev* ]]; then
  git submodule foreach "git checkout -b $branch || git checkout $branch"
fi

exit 0

参考

git hook

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

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

相关文章

nginx扩展篇之nginx.conf 详细文档

nginx.conf 配置文件 基本说明 Nginx 的配置文件位置 文件位置 ​ 安装目录\conf\nginx.conf ​ 安装目录\nginx.conf 两个文件是一样的 多说一句&#xff1a;使用/usr/local/nginx/sbin/nginx 启动Nginx &#xff0c;默认用的是安装目录\nginx.conf 配置文件 作用&…

网络安全学术顶会——SP 2023 议题清单、摘要与总结(上)

总结 本文总结了196篇近期涉及网络安全领域的研究论文。主要可分为以下几类: 隐私保护,涉及到匿名认证、隐私保护机器学习等机器学习安全,主要研究对抗样本和隐蔽后门等问题浏览器和网络安全,涉及指纹识别、端到端加密、网站选择标志等嵌入式系统安全,主要针对 IOT 安全操作系统…

java并发编程:LinkedBlockingQueue详解

文章目录 简介源码分析属性构造函数入队方法put(E e)offer(E e)offer(E e, long timeout, TimeUnit unit) 出队方法take()poll()获取元素方法删除元素方法 问题总结 简介 在集合框架里&#xff0c;想必大家都用过ArrayList和LinkedList&#xff0c;也经常在面试中问到他们之间…

光线追踪RayTracing,基本原理,判断物体与光线相交

光线的三点假设&#xff1a; 光线按直线传播光线之间不会发生碰撞光线会经过一系列折射反射进入摄像机 可以从摄像机发出光线&#xff0c;推出可逆的光路 上图中&#xff0c;透明球在与相机直连的线条处&#xff0c;需要将折射和反射的着色点结果相加&#xff0c;如果有光源直…

Neuroimage | LMDA-Net第一作者亲自讲述其设计思想

近期&#xff0c; 天津大学精仪学院和医工院联合&#xff0c;在神经科学和神经成像顶刊 Neuroimage中发表题为《LMDA-Net: 一种具有通用性和可解释性的轻量级EEG解码网络》的学术论文, 为解决人工神经网络模型在EEG解码时面临的跨数据集泛化性差、预测波动性高和模型可解释性差…

【2023】Redis cluster集群模式搭建

目录 1.cluster集群介绍2.搭建cluster集群2.1.架构图2.2.搭建集群2.2.1.创建所需配置文件2.2.2.创建集群所需容器2.2.3.创建集群&#xff1a;master1节点连接其他节点2.2.4.配置从节点&#xff0c;完成三主三从 3.在cluster集群内读写数据 1.cluster集群介绍 Redis Cluster是R…

每个程序员都必须知道的8种通用数据结构

8种常用数据结构 数据结构是一种特殊的组织和存储数据的方式&#xff0c;可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外&#xff0c;数据结构属于计算机科学和…

GitOps多环境部署问题及解决方案

大型组织应用GitOps难免会遇到在多环境中部署的问题&#xff0c;本文分析了应用环境分支策略会遇到到问题&#xff0c;介绍了应用文件夹策略解决这些问题的方案。原文&#xff1a;Stop Using Branches for Deploying to Different GitOps Environments[1], How to Model Your G…

STC8比较器功能案例介绍

STC8比较器功能案例介绍 &#x1f4cc;相关篇《STC8功能脚切换相关寄存器P_SW1和P_SW2以及MCLKOCR介绍》 &#x1f4cb;基于内部参考电压源&#xff0c;使用外部端口P3.7作为比较器正极输入源&#xff0c;比较器结果输出到P3.4 或者P4.1&#xff08;由P_SW2 中的CMPO_S 进行设定…

Oracle的最高认证并不是OCM,而是......

什么是Oracle数据库的最高认证呢&#xff1f;大家注意&#xff0c;不是Oracle OCM&#xff0c;而是Oracle高可用大师认证&#xff0c;全称叫&#xff1a;Maxium Availability Certified Master&#xff0c;要获得这一张证书&#xff0c;你需要同时有5个认证。 关于博主&#x…

Prompt 用法大全!让 ChatGPT 更智能的六种策略(中)

如果遵循以下六种策略来构建 Prompt 提示词&#xff0c;在和 ChatGPT 对话中我们将获得更好、更符合我们要求的回答。 这些策略&#xff0c;后几种更适合在编程调用 ChatGPT API 时使用&#xff0c;不过也适用直接和 ChatGPT 对话&#xff0c;让它更好的理解我们的意图。 1、写…

8.DIY可视化-拖拽设计1天搞定主流小程序-小程序首页幻灯片显示

小程序首页幻灯片显示 本教程均在第一节中项目启动下操作 小程序首页幻灯片显示前言一、添加组件: 图片轮播公告图文菜单二. 绑定幻灯片数据接口三:首页绑定接口数据:1.绑定字段 四.导出源码,解压后,导入hbulider,运行查看效果1.导出源码:2.解压,导入hbuilder 五.运行查看效果对…

Ae:蒙版插值面板

Ae菜单&#xff1a;窗口/蒙版插值 Mask Interpolation 蒙版插值Mask Interpolation面板可用于自动创建蒙版路径 Mask Path属性的关键帧&#xff0c;从而实现更平滑逼真的路径动画。 至少选择 2 个连续的蒙版路径关键帧后&#xff0c;智能蒙版插值将基于面板上的选项设置创建中间…

Qt5.12.6配置Android Arm开发环境(Linux)

1.安装jdk 2.安装android studio 3.安装sdk 与ndk 设置代理 安装SDK工具 安装SDK Platform 安装QT 选择JDK 1.8安装路径,SDK与NDK路径 如出现Platform SDK或者Platform Build Tools未安装,点击Update Installed 配置成功后可看到ARMv7与AMD-v8a kits Qt Version也可看到ARM…

既然有了HTTP,为什么还要RPC?

文章目录 HTTP和RPC区别RPC&#xff08;Remote Procedure Call&#xff09;服务流行的RPC框架 HTTP服务Restful RPC接口和HTTP接口的区别与联系传输协议传输效率性能消耗负载均衡服务治理&#xff08;下游服务新增&#xff0c;重启&#xff0c;下线时如何不影响上游调用者&…

Java012——Java引用数据类型String的简单学习

回顾Java数据类型 本次要学习的是Java引用数据类型String 一、对String类简单说明 说明&#xff1a;String是Java中的一个类 二、String类的作用 作用&#xff1a;主要用来创建和操作字符串。 三、使用String类 3.1、创建字符串 注意&#xff1a; 1、字符串使用双引号&qu…

基于Springboot+vue+协同过滤+前后端分离+鲜花商城推荐系统(用户,多商户,管理员)+全套视频教程

基于Springbootvue协同过滤前后端分离鲜花商城推荐系统(用户,多商户,管理员)(毕业论文11000字以上,共33页,程序代码,MySQL数据库) 代码下载: 链接&#xff1a;https://pan.baidu.com/s/1mf2rsB_g1DutFEXH0bPCdA 提取码&#xff1a;8888 【运行环境】Idea JDK1.8 Maven MySQL…

【网络原理】TCP/IP协议五层模型

&#x1f94a;作者&#xff1a;一只爱打拳的程序猿&#xff0c;Java领域新星创作者&#xff0c;CSDN、阿里云社区优质创作者。 &#x1f93c;专栏收录于&#xff1a;计算机网络原理 本期讲解协议、OSI七层模型、TCP/IP五层模型、网络设备所在的分层、数据的封装和分佣。 目录 …

Linux基础内容(22)—— 信号

Linux基础内容&#xff08;21&#xff09;—— 进程消息队列和信号量_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130770830?spm1001.2014.3001.5501 目录 1.定义 1.介绍 2.解释 例子 操作系统信号 实现的大致思路 2.信号的产生方式 …

【C语言】计算含多种运算符的表达式

计算含多种运算符的表达式 引入运算符的优先级算术表达式的运算规则引例例题 引入 诸如下面这些表达式&#xff0c;它的计算过程&#xff0c;计算顺序是怎样的&#xff1f;计算结果为多少&#xff1f; 今天我们就一起来解决一下这个问题吧&#xff01; 运算符的优先级 解决…