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" ] ;thenecho "$changes_files" files changed, running build script...python  scripts/build.pyif [ $? -ne 0 ]; thenecho "Build failed. Aborting commit."exit 1fi
elseecho "Skipping build: no changes in src directory."
fi# 允许继续
exit 0

📄 build.py的内容:

import os
import sys
import subprocessVCINSTALLDIR = "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_cmdtry: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;//异常代码, 未定义 testtest = 1;return 0;
}

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

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


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

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

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

相关文章

PHP多功能投票微信小程序系统源码

&#x1f389;一键决策&#xff0c;尽在掌握&#xff01;多功能投票小程序&#xff0c;让选择不再纠结&#x1f914; &#x1f4f2;【开篇&#xff1a;告别传统&#xff0c;拥抱便捷投票新时代】&#x1f4f2; 还在为组织投票活动手忙脚乱&#xff1f;或是面对众多选项犹豫不…

Hadoop发展史和生态圈介绍

目录 一、Hdoop概述 二、Hadoop生态组件 三、大数据的技术生态体系 四、Hadoop发展历史 4.1 概述 4.2 Hadoop历史发展节点 4.2.1 2002-2004年理论阶段 4.2.2 2005-2008年Hadoop的问世与崛起 4.2.3 2009-2017年Hadoop助力大数据行业的发展 4.2.4 至今 五、Hadoop优势特…

华为HCIP Datacom H12-821 卷40

1.单选题 下面是台路由器BGP错误输出信息&#xff0c;关于这段信息描述错误的是 <HUAWEI>display bgp error Error Type :Peer Error Date/Time :2010-03-22 12:40:39 Peer Address :10.1.1.5 Error Info : Incorrect remote AS A、可能是由于邻居…

面向 AI 而生的香橙派 AIpro 开发板开箱实测

前几天搞到一块很牛掰的开发板&#xff0c;是香橙派联合华为精心打造的高性能 AI 开发板 – OrangePi AIpro 开发板。 其搭载了昇腾 AI 处理器&#xff0c;可提供 8TOPS INT8 的计算能力&#xff0c;作为单板硬件设备来说&#xff0c;算力杠杠的了&#xff0c;至于跑 AI 模型性…

django实现用户的注册、登录、注销功能

创建django项目的步骤&#xff1a;Django项目的创建步骤-CSDN博客 一、前置工作 配置数据库&#xff0c;设置数据库引擎为mysql 1、在settings文件中找到DATABASES, 配置以下内容 DATABASES {"default": {ENGINE: django.db.backends.mysql, # 数据库引擎NAME: dja…

params和data的差别,doc下载

params和data的差别 export function downFile(url, parameter, method) {return axios({url: url,params: parameter,method: method ? method : "get",responseType: "blob",}); }// params: parameter,请求的参数&#xff0c;会作为查询字符串附加到…

实习随笔【前端技术实现全局添加水印】

有一些数据比较重要的项目&#xff0c;往往需要对数据进行保护措施&#xff0c;本文介绍常见策略——全局添加水印。 1、创建水印组件 <template><div class"water-mark"><div class"water-mark-content"><span class"phone&qu…

打破平台限制,使智能手机和平板电脑上无缝运行Windows x86/x64架构的软件和游戏的一款安卓应用

大家好&#xff0c;今天给大家分享一款专为Android设备设计的模拟器应用Winlator。其核心功能是能够在基于ARM架构的智能手机和平板电脑上无缝运行Windows x86/x64架构的软件和游戏。 Winlator是一款Android应用程序&#xff0c;它允许用户使用Wine和Box86/Box64在Android设备上…

docker-compose部署redis-exporter

一、安装prometheus 1、安装 version: 3.1services:redis-exporter:image: bitnami/redis-exporter:latestcontainer_name: redis-exporterports:- 9121:9121environment:TZ: Asia/Shanghaicommand:- --redis.addrredis://127.0.0.1:6379# - --redis.passwordlabels:org.labe…

C#学习3-微软C#官方文档Microsoft-dotnet-csharp.pdf

文章目录 1.内插表达式的字段宽度和对齐方式 1.内插表达式的字段宽度和对齐方式 static void Main(string[] args) {var titles new Dictionary<string, string>() {["Doyle ,Arthur"] "Hound of the Basker,The",["Lodon ,Jack"] &quo…

PHP恋爱话术微信小程序系统源码

&#x1f496;恋爱高手的秘密武器&#xff01;恋爱话术微信小程序&#xff0c;让情话信手拈来✨ &#x1f4ad;【开场白&#xff1a;恋爱路上的甜蜜助手】&#x1f4ad; 还在为跟心仪的TA聊天时找不到话题而尴尬&#xff1f;或是担心自己说的每句话都显得那么“直男/女”&…

Linux上启动和停止jar

linux 后台运行jar 在Linux系统中&#xff0c;要想让jar包在后台运行&#xff0c;可以使用nohup命令和&符号。nohup命令可以使进程在后台不受挂起信号影响的执行&#xff0c;而&符号则是将任务放入后台执行。 以下是一个简单的命令示例&#xff0c;它将启动一个jar包…

记一次使用vue连接rabbitMq

连接rabbitMq需要使用stompjsnpm i stompjs 下下面是连接代码 import Stomp from stompjsonConnected(frame) {// 绑定交换机exchange_pushmsg是交换机的名字rk_pushmsg是绑定的路由keyvar exchange this.rabbitMqexchange || queue.device.zzzz// 创建随机队列用上面的路由k…

安全编织:Eureka驱动的分布式服务网格安全策略

安全编织&#xff1a;Eureka驱动的分布式服务网格安全策略 在微服务架构的复杂网络中&#xff0c;服务的安全性是维护系统稳定运行的基石。服务网格&#xff08;Service Mesh&#xff09;作为微服务间通信的代理层&#xff0c;承担着保障服务间通信安全的重要职责。Eureka&…

vi 编辑器快捷生成 main 函数和基本框架

step1: 执行 sudo vi /etc/vim/vimrc &#xff08;修改vimrc需要管理员权限&#xff1a;sudo&#xff09; step2:输入用户密码&#xff0c;回车, 编辑vimrc文件 step3:在尾行输入以下代码&#xff08;可复制&#xff09; map mf i#include<stdio.h><ESC>o#includ…

Web3发展的基本要素

区块链&#xff1a;分布式数据库 1 区块链是一种新型的分布式数据库协议&#xff0c;是实现Web3的最核心技术。 2 区块链的技术特性使其能够&#xff1a; 1&#xff09;安全地存储数据&#xff0c;得益于现代计算机密码学&#xff0c;用户可以获得自己独特、安全的账户&…

java itextPdf根据pdf模板,编辑保存pdf后可二次编辑处理

java 支持pdf 多次编辑的重点只有两个 1&#xff1a;flat属性 2&#xff1a;设置文本域只读属性 看似简单的两个问题&#xff0c;却耗费了一天的时间。pdf没有官方文档太难受了&#xff0c;只能在网上查找相关的案 例。但是很多文章都是copy别人的。没有实际效果。皇天不负有…

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】

项目场景&#xff1a; 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时&#xff0c;会发现这个文件下载的默认保存位置和我们预想的不太一样&#xff0c;容易找不到&#xff0c;而且没有提示&#xff0c;那么我们就需要把文件打开自己保存并且有提示保存到哪个…

探索前沿科技:从迁移学习看人工智能的无限可能性

从迁移学习看人工智能的无限可能性 1 引言1.1 什么是迁移学习1.1.1 迁移学习的定义1.1.2 迁移学习的起源和背景 1.2 迁移学习的重要性1.2.1 解决小数据集问题1.2.2 提高模型训练效率1.2.3 应用于不同领域的广泛性 1.3 迁移学习的前景 2 迁移学习的基本概念2.1 源域和目标域2.1.…

【区块链 + 智慧政务】涉税行政事业性收费“e 链通”项目 | FISCO BCOS应用案例

国内很多城市目前划转至税务部门征收的非税收入项目已达 17 项&#xff0c;其征管方式为行政主管部门核定后交由税务 部门征收。涉税行政事业性收费受限于传统的管理模式&#xff0c;缴费人、业务主管部门、税务部门、财政部门四方处于 相对孤立的状态&#xff0c;信息的传递靠…