返回顶部
首页 > 资讯 > 精选 >Git的Hooks怎么自定义使用
  • 581
分享到

Git的Hooks怎么自定义使用

2023-06-29 09:06:56 581人浏览 安东尼
摘要

这篇文章主要介绍“git的Hooks怎么自定义使用”,在日常操作中,相信很多人在Git的Hooks怎么自定义使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Git的Hooks怎么自定义使用”的疑惑有所帮助!

这篇文章主要介绍“git的Hooks怎么自定义使用”,在日常操作中,相信很多人在Git的Hooks怎么自定义使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Git的Hooks怎么自定义使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Git 除了版本控制,还有一些其他的高级功能,其中之一就是Git Hooks,明面意思就是钩子,可以类比于钩子函数。简单说就是Hook会在做某些事情的前后被钩子钩走去一些额外事情,那么这些额外事情我们可以用作于检查、测试和部署等操作。
在 Git 中有许多的事件(commit、push 等等),每个事件也是对应了有不同的钩子的(如 commit 前,commit 后),那么我们就可以在这些钩子这里配置一些自己需要执行的操作来实现各种各样的需求。

Git Hooks 介绍

Git hooks 是 Git 在事件之前或之后执行的脚本, 用于控制 git 工作的流程。Git hooks 脚本对于我们提交code review 之前识别一些简单的问题很有用。 我们在每次提交代码时都会触发这些 hooks,以自动指出代码中的问题,例如缺少分号,尾随空白和调试语句。通过在code review 之前指出这些问题,代码审阅者可以专注于代码结构和功能的更改,而不需要浪费时间来审查这些格式问题。
Git hooks 分为客户端钩子和服务端钩子。客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
客户端钩子:pre-commitprepare-commit-msgcommit-msgpost-commit等,主要用于控制客户端 git 的提交和合并这样的操作。
服务端钩子:pre-receivepost-receiveupdate,主要在服务端接收提交对象时、推送到服务器之前调用。

  • pre-commit: Check the commit message for spelling errors.

  • pre-receive: Enforce project coding standards.

  • post-commit: Email/SMS team members of a new commit.

  • post-receive: Push the code to production.

Git hooks 如何工作

Git Hooks 就是在.git/hooks文件下,保存了一些 shell 脚本,然后在对应的钩子中执行这些脚本就行了。比如下图中,这是一个还没有配置 Git Hooks 的仓库,默认会有很.sample结尾的文件,这些都是示例文件

例如打开pre-commit.sample文件看一下其中的内容,意思是一个示例钩子脚本,用于验证将要提交的内容,由没有参数的“git commit”调用,如果钩子想要停止提交,那么它应该在发出适当的消息后以非零状态退出。这个脚本默认是不生效的,如果要生效,把文件名改为pre-commit即可。pre-commit这个钩子是在git commit命令执行之前触发。


自定义使用方法

1. 添加命名相同的脚本文件

任何正确命名的可执行脚本都可以正常使用 ,也可以用Ruby或python,或其他脚本语言。如下我们编写一个与prepare-commit-msg相同命名的Python脚本即可,注意第一行改成了python解释器的路径。

#!/usr/bin/env pythonimport sys, oscommit_msg_filepath = sys.argv[1]with open(commit_msg_filepath, 'w') as f:    f.write("# Please include a useful commit message!")

此外,这里用sys.argv[1]而不是$1来获取第一个参数。这个特性非常强大,因为你可以用任何你喜欢的语言来编写Git钩子。

2. 直接修改sample文件

使用shell 这里尝试写一个简单的钩子,安装一个prepare-commit-msg钩子。去掉脚本的.sample拓展名,在文件中加上下面这两行:

#!/bin/shecho "# Please include a useful commit message!" > $1

接下来你每次运行git commit时,你会看到默认的提交信息都被替换了。
内置的样例脚本是非常有用的参考资料,因为每个钩子传入的参数都有非常详细的说明(不同钩子不一样)。

3. 链接自定义文件

因为hook文件其实就是个脚本文件,我们可以写一个脚本文件到项目被git管理的任意目录里即可,只要在.git/hooks/里的默认脚本文件中,执行我们外部的这个文件即可。

  • 自定义脚本文件:项目根目录/githooks/commit-msg-impl.py

#!/usr/bin/env pythonimport sys, os, refrom subprocess import check_output# 收集参数,第一个参数是commit的信息的文件commit_msg_filepath = sys.argv[1]# 打开commit提交消息的文件,检测消息是否以指定格式开头的,不是则异常退出,终止这次commit消息的提交with open(commit_msg_filepath, 'r') as f:    content = f.read()    if not content.startswith("xxxx"):        print "commit-msg: ERROR! The commit message must start with xxxx"        sys.exit(1)- 默认hooks文件:.git/hooks/commit-msg#!/bin/bashGIT_ROOT="$(git rev-parse --show-toplevel)"FILE_NAME=$GIT_ROOT/githooks/commit-msg-impl.pyif  [ -f "$FILE_NAME" ]; then    source $FILE_NAMEfi

Husky 配置

从上面的介绍中,我们知道 Git Hook 保存在 .git 文件夹中,Git 是一个多人协作工具,那按理说 Git 仓库中的所有文件都应该被跟踪并且上传至远程仓库的。但有个例外,.git文件夹不会,这就导致一个问题,我们在本地配置好 Git Hook 后,怎么分享给其他小伙伴儿呢?这时候,就轮到 Husky 出场了。
Husky 的原理是让我们在项目根目录中写一个配置文件,然后在安装 Husky的时候把配置文件和 Git Hook 关联起来,这样我们就能在团队中使用 Git Hook 了。

第一步

使用 npm 初始化你的项目(如果项目已有 package.JSON,请跳至第二步)

npm init -y
第二步

安装 Husky

// 注意 node.js 版本要 >=10npm install husky -D
第三步

书写配置文件,4.2.5 版本的 Husky 共支持以下几种格式的配置文件:

  • .huskyrc

  • .huskyrc.json

  • .huskyrc.yaml

  • .huskyrc.yml

  • .huskyrc.js

  • husky.config.js
    个人习惯,这里我采用的是.huskyrc,在其中书写 json 格式的配置,如下:

{  "hooks": {    "pre-commit": "git restore -W -S dist examples/dist"  }}

是不是很简单,我们来解读一下这个配置文件。hooks这个对象中,key 就是钩子名,而 value 就是需要执行的命令。上面这个配置的含义就是,在每次执行 git commit之前,都会把dist和examples/dit目录下的修改回滚,即不想这个目录的文件被上传。
上面我们只写了一条命令,如果想执行两条命令怎么办呢?比如我还想在git commit之前用 EsLint 检查一下代码质量,我们可以像下面这样写:

{  "hooks": {    "pre-commit": "git restore -W -S dist examples/dist && eslint ."  }}

是的,就是这么简单。如果 EsLint 检测不通过,那么git commit是会被阻止的,就不用担心"垃圾代码"被提交到线上仓库了。

Husky 注意事项

Husky 让我们可以很方便的配置 Git Hooks,同时,也提供了一些实用方便的小技巧以及一些我们需要注意的点

不支持的钩子

Husky 不支持服务端 Git 的钩子:

  • pre-receive

  • update

  • post-receive
    跳过所有钩子
    有时你可能不想运行钩子,那么可以像下面这样跳过:

HUSKY_SKIP_HOOKS=1 git rebase ...
禁用自动安装

如果你不想 Husky 为你自动安装钩子(比如 clone 了一个第三方的库,想要自己开发时),可以这样做:

HUSKY_SKIP_INSTALL=1 npm install

到此,关于“Git的Hooks怎么自定义使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Git的Hooks怎么自定义使用

本文链接: https://lsjlt.com/news/323988.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Git的Hooks怎么自定义使用
    这篇文章主要介绍“Git的Hooks怎么自定义使用”,在日常操作中,相信很多人在Git的Hooks怎么自定义使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Git的Hooks怎么自定义使用”的疑惑有所帮助!...
    99+
    2023-06-29
  • Vue3中怎么自定义Hooks
    本文小编为大家详细介绍“Vue3中怎么自定义Hooks”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3中怎么自定义Hooks”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Composition Api解耦...
    99+
    2023-07-02
  • Vue怎么自定义hooks函数
    本文小编为大家详细介绍“Vue怎么自定义hooks函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么自定义hooks函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在Vue当中,一个非常重要的功能就...
    99+
    2023-07-05
  • 怎么在react中创建自定义hooks
    这篇文章主要介绍“怎么在react中创建自定义hooks”,在日常操作中,相信很多人在怎么在react中创建自定义hooks问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在react中创建自定义hooks...
    99+
    2023-06-25
  • vue3使用自定义hooks获取dom元素的问题说明
    目录使用自定义hooks获取dom元素问题分享下楼主自己的观点vue获取/操作组件的dom元素下面是我的代码内容(非全部内容)最后总结使用自定义hooks获取dom元素问题 在自定义...
    99+
    2024-04-02
  • vue3在自定义hooks中使用useRouter报错的解决方案
    目录自定义hooks中使用useRouter报错useRouteruseRoute使用Vue.use()报错“Cannot read property ‘us...
    99+
    2022-11-13
    vue3 useRouter报错 vue3自定义hooks 使用useRouter报错
  • 如何使用自定义hooks对React组件进行重构
    这篇文章主要介绍了如何使用自定义hooks对React组件进行重构的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用自定义hooks对React组件进行重构文章都会有所收获,下面我们一起来看看吧。处理复杂性...
    99+
    2023-07-05
  • Android怎么自定义ProgressDialog使用
    要自定义ProgressDialog,可以按照以下步骤进行操作:1. 首先,创建一个新的类来扩展ProgressDialog类。例如...
    99+
    2023-08-09
    Android ProgressDialog
  • 如何使用tmux和Git自定义Linux终端
    这篇文章将为大家详细讲解有关如何使用tmux和Git自定义Linux终端,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我使用 GNOME 终端,主要是因为它是我的发行版的默认设置。但是我终端内远非“默认值...
    99+
    2023-06-15
  • vue3的setup语法如何自定义v-model为公用hooks
    目录前言基础基本的v-model多个v-model绑定v-model修饰符进阶问题背景方式一:通过watch中转方式二:computed的get和set终极:封装v-model的ho...
    99+
    2024-04-02
  • 怎么使用MyBatis的自定义注解
    要使用MyBatis的自定义注解,首先需要定义一个注解并在需要使用的地方进行标注。然后在MyBatis的配置文件中设置对应的处理器,...
    99+
    2024-03-08
    MyBatis
  • vue3封装自定义v-model的hooks示例详解
    目录前言基础基本的v-model多个v-model绑定v-model修饰符进阶问题背景方式一:通过watch中转方式二:computed的get和set终极:封装v-model的ho...
    99+
    2024-04-02
  • html5自定义属性怎么使用
    这篇文章主要介绍了html5自定义属性怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇html5自定义属性怎么使用文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • Java注解怎么自定义使用
    这篇文章主要介绍了Java注解怎么自定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java注解怎么自定义使用文章都会有所收获,下面我们一起来看看吧。注解注解基本介绍注解概述:Java 注解(Annota...
    99+
    2023-07-05
  • PHP中怎么使用自定义路由
    这篇文章将为大家详细讲解有关PHP中怎么使用自定义路由,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体实现:我在网站文件夹目录中新增了一个”API”文件夹,在里面新建一个.htaccess...
    99+
    2023-06-17
  • C#中怎么使用自定义数据
    本篇文章为大家展示了C#中怎么使用自定义数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#语言有很多值得学习的地方,这里我们主要介绍C#自定义数据,包括介绍每一个由DBObject派生的对象都拥...
    99+
    2023-06-17
  • Vue怎么自定义指令directive使用
    本篇内容主要讲解“Vue怎么自定义指令directive使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么自定义指令directive使用”吧!1. 一个指令定义对象可以提供如下几个钩...
    99+
    2023-07-06
  • 怎么用自定义注解
    本篇内容介绍了“怎么用自定义注解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本知识在Java中,注解分为两种,元注解和自定义注解。很多人...
    99+
    2023-06-16
  • 怎么使用CSS创建自定义光标
    这篇文章主要介绍了怎么使用CSS创建自定义光标,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 答:使用CSScursor属性 您可以使用...
    99+
    2024-04-02
  • 使用Unity怎么自定义保存日志
    这期内容当中小编将会给大家带来有关使用Unity怎么自定义保存日志,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。using UnityEngine;using System.IO;us...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作