官方文档 Git - githooks Documentation
Learn how to improve your Git skills

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命令执行之前触发。
Git 支持的所有钩子见下表(加粗的为常用钩子):

自定义使用方法

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/sh
echo "# Please include a useful commit message!" > $1

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

3. 链接自定义文件

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

  • 自定义脚本文件:项目根目录/githooks/commit-msg-impl.py
#!/usr/bin/env python
import sys, os, re
from 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/bash
GIT_ROOT="$(git rev-parse --show-toplevel)"
FILE_NAME=$GIT_ROOT/githooks/commit-msg-impl.py
if  [ -f "$FILE_NAME" ]; thensource $FILE_NAME
fi

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 版本要 >=10
npm 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的使用_依生依世-CSDN博客_git hooks
Git 钩子 hook 介绍与使用
GitHook 工具 – husky介绍及使用 - 较瘦 - 博客园
一文带你彻底学会 Git Hooks 配置

Git Hooks 使用说明相关推荐

  1. 搭建Git服务器环境----Git hooks代码自动部署

    引言:自己想搭一套git的服务端环境,不想用github码云等.经多方资料整合,实验总结,以下是亲测有效的方式.可用于公司日常开发 一.搭建Git环境 ① 安装 Git Linux 做为服务器端系统, ...

  2. spring.profiles.active配置了没生效_一文带你彻底学会 Git Hooks 配置

    你好,我是小桔,是一个没有感情的代码崽. 今天给大家介绍一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,还有许多高级功能,Git Hooks 就是其中之一. 本文环境: ...

  3. yii urlmanager配置post不生效_一文带你彻底学会 Git Hooks 配置

    你好,我是小桔,是一个没有感情的代码崽. 今天给大家介绍一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,还有许多高级功能,Git Hooks 就是其中之一. 本文环境: ...

  4. git php自动发布,使用 Git Hooks 实现自动部署PHP项目

    最近正在寻找一种简便的自动部署代码到服务器的方式,然后就发现了git hooks这个方法,查了一些资料再自己尝试过后,觉得还不错,记录下. 什么是git hooks 在git上是这么介绍的: 和其它版 ...

  5. 在 git hooks 中运行 npm script

    在 git hooks 中运行 npm script 严肃的研发团队都会使用 Git 之类的版本管理系统来管理代码,随着 GitHub 的广受欢迎,相信大家对 Git 并不陌生.Git 在代码版本管理 ...

  6. 初试 Git hooks 自动部署

    对于经常变动的网站来说, 手动部署是一件非常痛苦的事情 1. login remote host 2. cd ... 3. git pull 4. npm install 5. npm run XXX ...

  7. 012-基于 git hooks 的前端代码质量控制解决方案

    原文看这里:https://github.com/kuitos/kui... 全部文章看这里 https://github.com/kuitos/kui... 国际惯例先说下故事背景 通常情况下,如果 ...

  8. 基于git hooks的前端代码质量控制解决方案

    基于git hooks的前端代码质量控制解决方案 原文:https://github.com/kuitos/kuitos.github.io/issues/28 国际惯例先说下故事背景 通常情况下,如 ...

  9. 基于 git hooks 的前端代码质量控制解决方案

    原文看这里:https://github.com/kuitos/kui... 全部文章看这里 https://github.com/kuitos/kui... 国际惯例先说下故事背景 通常情况下,如果 ...

最新文章

  1. 登录文档服务器,服务器登录login
  2. python第三方库numpy-浅谈python的第三方库——numpy(终)
  3. (转)几种流行的JS框架的选择
  4. python将变量i的值增加1_Python中变量自增、i+=x与i=i+x、is与==
  5. windows mobile创建文本文件并用word打开
  6. c语言中10转8和16的转换,(C语言)10进制转换2,8,16进制
  7. 监控整页,非AJAX,要求通知
  8. H5添加禁止缩放功能
  9. Boot loader: Grub入门(转)
  10. “约见”面试官系列之常见面试题第十一篇之canvas(建议收藏)
  11. Linux USB设备驱动程序设计 和 USB下载线驱动设计
  12. django3 websockets
  13. drozer安全评估框架基础使用技法
  14. U盘被写保护无法格式化的解决方法
  15. 互联网+AI,云反射弧如何成为人工智能发展的下一个重点
  16. Es6类数组length属性和扩展方法,find(),findIndex(),fill(),copyWithin(),entries()...用法
  17. FBI 打击全球 DDoS 出租市场
  18. 物联网开放平台使用总结
  19. 链克袋鼠Linker创建链克账户教程
  20. 怎么查找计算机里的金蝶账套,金蝶帐套数据如何拷贝到另一台电脑上

热门文章

  1. 获取Android手机SD卡容量大小
  2. 拒不修图的拍摄软件,这一刻APP能否在美图时代生存?
  3. magic3鸿蒙系统,如果荣耀Magic3搭载了屏下镜头和鸿蒙系统,你会做第一批吗?
  4. 基于linux嵌入式浏览,基于Linux的嵌入式浏览器的实现
  5. RocksDB学习记录
  6. “第三方登录”中的“花式捆绑”是什么
  7. pfSense高可用性集群设置指南
  8. 路由表 (RIB) 与转发表 (FIB)
  9. 2023年,想要靠做软件测试获得高薪,我还有机会吗?
  10. django-生成详细的操作日志