Git钩子Hook功能

💾 Hook 钩子


目录

  • 🔔 简介
  • 🔔 常见类型
  • 🔔 如何配置
  • 🔔 使用场景
  • 🔔 示例

🔔 简介

Git Hooks是Git内置的一种机制,允许在特定事件发生时执行自定义脚本。Git Hook可以在客户端和服务器端配置,经常用于自动化任务、增强开发流程以及确保代码质量。



🔔 常见类型

📄项目📜类型💡含义
客户端
Hooks
pre-commit在提交前运行
prepare-commit-msg在生成提交信息前运行
commit-msg在提交信息编辑完成后运行
post-commit在提交完成后运行
pre-rebase在变基操作前运行
pre-push在推送代码前运行
服务器
Hooks
pre-receive在服务器端接收到推送数据前运行
update在服务器端更新每个分支前运行
post-receive在服务器端接收推送数据后运行


🔔 如何配置

📄 个人配置:

将个人使用的Git Hook脚本存放在.git/hooks目录下。该目录默认包含一些示例脚本,可以将这些脚本重命名或替换为自定义脚本。


📄 团队配置:

将所有团队成员需要的Hook脚本放在项目中的某个目录(例如hooks),然后在项目根目录的.git配置文件中配置core.hooksPath指向该目录。

配置命令:

git config core.hooksPath hooks

.git目录下的config文件内容可看到多了hooksPath = hooks 的字段:

[core]
	...
	hooksPath = hooks

取消配置命令:

git config --unset core.hooksPath


🔔 使用场景

  • 💡 代码格式检查:pre-commit在提交之前使用工具检查代码格式是否符合团队规范。
  • 💡 运行单元测试:pre-commit在提交之前运行单元测试,确保新代码不会破坏现有功能。
  • 💡 提交信息检查:commit-msg确保提交信息符合特定格式或包含必要的内容。
  • 💡 代码审查:提交或推送代码时触发代码审查工具,自动化代码审查流程。
  • 💡 自动部署:在推送代码到特定分支后结合CI/CD工具自动部署到测试或生产环境。


🔔 示例

以下是使用pre-commit作为钩子的示例。每次提交前会执行该钩子。

📄 项目的结构:

GitHooksExample
├─ CMakeLists.txt
├─ hooks
│    └─ pre-commit
├─ scripts
│    └─ build.py
└─ src
       └─ main.cpp

在hooks目录(使用git config core.hooksPath hooks命令配置指向该目录)下有一个pre-commit的钩子。
在scripts目录下有个Python脚本,该脚本会被钩子使用,执行的时候会构建项目。


📄 pre-commit的内容:

#!/bin/bash

# 如果src目录下存在修改的文件就运行Python脚本
changes_files=$(git diff --name-only --relative=src)
if [ -n "$changes_files" ] ;then
  echo "$changes_files" files changed, running build script...
  python  scripts/build.py
  if [ $? -ne 0 ]; then
      echo "Build failed. Aborting commit."
      exit 1
  fi
else
    echo "Skipping build: no changes in src directory."
fi

# 允许继续
exit 0

📄 build.py的内容:

import os
import sys
import subprocess

VCINSTALLDIR = "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvarsall.bat"

current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
build_dir = os.path.normpath(current_dir + "/build")
os.makedirs(build_dir, exist_ok=True)

build_cmd = [f'{os.path.normpath(VCINSTALLDIR)}', 'x86']

cmake_cmd = [
    f'cmake',
    f'-DCMAKE_BUILD_TYPE=RelWithDebInfo',
    f'-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE',
    f'-S{current_dir}',
    f'-B{build_dir}',
    '-G', 'Ninja'
]
cmake_build_cmd = [
    f'cmake',   
    f'--build', f'{build_dir}', 
    f'--config', f'RelWithDebInfo'
]

cmd = build_cmd + ['&&'] + cmake_cmd + ['&&'] + cmake_build_cmd

try:
    subprocess.run(cmd, shell=True, check=True)
    print("编译成功!")
    sys.exit(0)
except subprocess.CalledProcessError as e:
    print("编译失败:", e)
    sys.exit(1)

📄 提交时触发hooks:
在这里插入图片描述

可以看到在提交前对工程进行构建编译,编译完成后才会提交。


📄 提交异常代码时触发hooks:

接下来演示一下当main.cpp文件代码异常时的提交:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    
	//异常代码, 未定义 test
	test = 1;
	return 0;
}

进行提交时,可以看到编译构建失败,提交中止:
在这里插入图片描述

这样可以避免提交了一个错误的代码。减少错误。


本文件示例工程源码下载:https://download.csdn.net/download/qq_41898196/89543736

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…

[论文笔记]构建基于RAG聊天机器人的要素

引言 今天带来一篇构建RAG的论文笔记&#xff1a;FACTS About Building Retrieval Augmented Generation-based Chatbots。 基于生成式人工智能构建企业聊天机器人迅速成为行业中最受关注的应用之一&#xff0c;旨在提高员工生产力。 然而&#xff0c;构建成功的企业聊天机器…

爬虫-requests和Selenium

1、了解requests的功能 1.1 使用post和get发送请求 HTTP中常见发送网络请求的方式有两种&#xff0c;GET和POST。GET是从指定的资源请求数据&#xff0c;POST是向指定的资源提交要被处理的数据。 GET的用法&#xff1a; import requestsr requests.get("https://www.…

随机过程基础:2.Markov (马尔可夫)过程(2)

纯生过程和纯灭过程 纯生过程&#xff1a;想象一下一个生物种群&#xff0c;比如一群兔子&#xff0c;在没有天敌的理想环境中&#xff0c;食物充足&#xff0c;疾病不存在。在这样的环境下&#xff0c;兔子的种群只会增加&#xff0c;不会减少。纯生过程模型就是用来描述这种情…

Android使用ANativeWindow更新surfaceView内容最简Demo

SurfaceView简介 SurfaceView对比View的区别 安卓的普通VIew,都依赖于当前Activity的Window的surface&#xff0c;这个surface用于承载view树从底到顶绘制出来的所有内容&#xff0c;因此任何一个view需要更新时&#xff0c;都需要把所有view中底到顶进行更新&#xff0c;即使使…

人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解1

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解。在深度学习领域,循环神经网络(RNN)因其处理序列数据的能力而备受关注。然而,传统的RNN存在梯度消失和梯度爆炸的问题,这使得它在长序列任务中的表现不尽…

【Diffusion学习】【生成式AI】淺談圖像生成模型 Diffusion Model 原理

文章目录 Diffusion Model 是如何运作的&#xff1f;吃额外的1个数字&#xff1a;stepDenoise 模组内部实际做的事情&#xff1a;预测noise如何训练 Noise Predictor Text-to-ImageDDPM 算法 from&#xff1a; https://www.youtube.com/watch?vazBugJzmz-o&listPLJV_el3uV…

深入剖析 Android 开源库 EventBus 的源码详解

文章目录 前言一、EventBus 简介EventBus 三要素EventBus 线程模型 二、EventBus 使用1.添加依赖2.EventBus 基本使用2.1 定义事件类2.2 注册 EventBus2.3 EventBus 发起通知 三、EventBus 源码详解1.Subscribe 注解2.注册事件订阅方法2.1 EventBus 实例2.2 EventBus 注册2.2.1…

无人机之电动系统篇

无人机的动能系统为无人机提供了动力&#xff0c;使无人机能够进行飞行活动。电动系统是无人机动力系统的其中一种。电力系统是将化学能转化为电能&#xff0c;再转化为机械能&#xff0c;为无人机飞行提供动力的系统。电力系统有电池、电调、电机和螺旋桨四个部分组成。 电池…

论文阅读【时间序列】TimeMixer (ICLR2024)

【时间序列】TimeMixer (ICLR2024) 原文链接&#xff1a;TIMEMIXER: DECOMPOSABLE MULTISCALE MIXING FOR TIME SERIES FORECASTING 代码仓库&#xff1a;https://github.com/kwuking/TimeMixer 符号定义 符号含义P用于预测的历史序列长度&#xff08;seq_len&#xff09;F预测…

第七天 SpringBoot与SpringCloud微服务项目交付

Spring Cloud微服务项目交付 微服务扫盲篇 微服务并没有一个官方的定义&#xff0c;想要直接描述微服务比较困难&#xff0c;我们可以通过对比传统WEB应用&#xff0c;来理解什么是微服务。 单体应用架构 如下是传统打车软件架构图&#xff1a; 这种单体应用比较适合于小项…

LVS+Keepalive高可用

1、keepalive 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;vip漂移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到住服务器 1、配优先级 2、配置vip和真实服务器 3、主…

基于hive数据库的泰坦尼克号幸存者数据分析

进入 ./beeline -u jdbc:hive2://node2:10000 -n root -p 查询 SHOW TABLES; 删除 DROP TABLE IF EXISTS tidanic; 上传数据 hdfs dfs -put train.csv /user/hive/warehouse/mytrain.db/tidanic 《泰坦尼克号幸存者数据分析》 1、原始数据介绍 泰坦尼克号是当时世界上…

PyTorch人脸识别

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 一套基本的人脸识别系统主要包含三部分&#xff1a;检测器、识别器和分类器&#xff0c;流程架构如图11-3所示&#xff1a; 图11-5 检测器负责检测图片中的人脸&#xff0c;再将检测出来的人脸感兴趣区域&#xff08;Reg…

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式&#xff08;又译作色度采样结构、像素格式&#xff09;&#xff1a; 在vlc中也可以获取到色彩格式&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 这个色彩格式就是之前的文章《音视频入门基础…

2024年初级注册安全工程师职业资格考试首次开考!

​2024年初级注册安全工程师考试首次开考&#xff08;注&#xff1a;该考试由各省人事考试局组织考试&#xff09;。目前未取得中级注册安全工程师证书的各位同学&#xff0c;可以关注该考试&#xff0c;毕竟初级考证相对较容易&#xff0c;先去考一个。 目前初安开考地区汇总…

【Diffusion学习】【生成式AI】Stable Diffusion、DALL-E、Imagen 背後共同的套路

文章目录 图片生成Framework 需要3个组件&#xff1a;相关论文【Stable Diffusion&#xff0c;DALL-E&#xff0c;Imagen】 具体介绍三个组件1. Text encoder介绍【结论&#xff1a;文字的encoder重要&#xff0c;Diffusion的模型不是很重要&#xff01;】评估指标&#xff1a;…

大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】

大数据面试SQL题复习思路一网打尽&#xff01;(文档见评论区)_哔哩哔哩_bilibiliHive SQL 大厂必考常用窗口函数及相关面试题 大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】大数据面试SQL题-笔记02【...】 目录 01、力扣网-sql题 1、高频SQL50题&#xff08…

基于Java的斗地主游戏案例开发(做牌、洗牌、发牌、看牌

package Game;import java.util.ArrayList; import java.util.Collections;public class PokerGame01 {//牌盒//♥3 ♣3static ArrayList<String> list new ArrayList<>();//静态代码块//特点&#xff1a;随着类的加载而在加载的&#xff0c;而且只执行一次。stat…

【C语言】深入解析选择排序

文章目录 什么是选择排序&#xff1f;选择排序的基本实现代码解释选择排序的优化选择排序的性能分析选择排序的实际应用结论 在C语言编程中&#xff0c;选择排序是一种简单且直观的排序算法。尽管它在处理大型数据集时效率不高&#xff0c;但由于其实现简单&#xff0c;常常用于…