Git中的钩子可以理解为一个特殊动作触发的脚本。

任何时候当版本库中出现如提交或补丁等特殊事件时,都会触发执行一个或多个任意的脚本。通常情况下,一个事件会分解为多个规定好的步骤,可以为每个步骤绑定自定义脚本。当Git事件发生时,每一步开始都会调用相应的脚本。

钩子只属于并作用于一个特定的版本库,在克隆操作中不会复制。换句话说,在私有版本库中设置的钩子不会传送到新克隆的版本库,也就不会改变新克隆的仓库的行为。而如果真的有需要的话,则需要获取被克隆版本库的.git/hooks目录。

一个钩子既可以在当前本地版本库的上下文中运行,也可以在远程版本库的上下文中运行。大多数Git钩子属于两类:

  • 前置(pre)钩子会在动作完成前调用。要在变更应用前进行批准,拒绝或者调整操作,可以使用前置钩子
  • 后置(post)钩子会在动作完成后调用,其可用于触发通知或者额外处理,如执行构建或关闭bug

通常情况下,如果前置钩子以非零状态推出,即异常,那么Git的动作会终止,而后置钩子的总是在Git操作后执行,因此其状态总是会被忽略。

从上面的描述来看,钩子的特性有:

  • 改变Git的行为
  • 拖慢原来的Git操作
  • 加快或拖慢工作效率,这取决于钩子本身的优劣
  • 版本库中的钩子不会自动复制

安装钩子

每个钩子简单地说都是一个脚本,作用于一个特定版本库的钩子集合都位于.git/hooks目录下。不过既然是脚本,就应该遵循UNIX脚本的基本规范,文件本身是可执行的和文件首行应指明脚本使用的语言。

每个钩子都是以它相关联的事件命名的。如在git commit操作之前执行的钩子称为.git/hooks/pre-commit。

钩子示例

在创建新的版本库时,钩子是自动复制自本地的Git模板目录的。比如Windows中的Git模板来自Git\mingw64\share\git-core\templates\hooks这个目录。绝大多数Git版本都包含用户可以使用的一些钩子,并会预装到模板目录下。

对于模板钩子来说:

  • 可能模板钩子并不能满足用户的需要
  • 尽管钩子是默认创建的,但初始时它们都是禁用的。根据具体的Git版本和操作系统的不同,钩子可以通过移除可执行位或在名字后添加.sample后缀来禁用
  • 而为了启用钩子,就需要移除.sample名称后缀,并设置可执行位

可用的钩子

可执行git help hooks查看Git当前版本总可用的钩子。

与提交相关的钩子

所有提交钩子都是为git commit服务的,但git rebase/git merge/git am都默认不执行提交钩子,然后git commit --amend会执行提交钩子。

当执行git commit时,Git会执行上图的过程:

  • 在提交内容发生错误时,pre-commit钩子能够使该提交被放弃。因为pre-commit钩子会在用户能够编辑提交信息前执行,因此用户不会在输入了提交消息之后才发现被拒绝了。还可以使用该钩子自动修改提交内容。
  • pre-commit-msg钩子能够让用户在Git的默认消息展示给用户前做出修改。比如,可以使用其来修改默认的提交消息模板
  • commit-msg钩子能在用户编辑后验证或修改提交信息。比如拼写检查等
  • post-commit钩子在提交操作结束后执行。比如可以更新日志,发送通知邮件等

与补丁相关的例子

当执行git am时,Git会执行上图的过程:

  • applypatch-msg会检查补丁中的提交消息并决定其是否是可接受的。比如根据补丁内容确定是否要接受该补丁
  • pre-applypatch钩子在应用补丁之后,提交结果之前执行的
  • post-applypatch和post-commit脚本类似

与推送相关的钩子

当执行git push时,Git的接收端会执行上图的过程。

所有与推送相关的狗子都在接收端执行,而不是发送端。因此,执行的钩子脚本是在接收端的.git/hooks目录下运行,而不是在发送端。远程钩子的输出结果会显示给执行git push的用户。

而git push的第一步是将本地版本库中所有缺少的对象传输到远程版本库中,此时不需要钩子,因为所有的Git对象都是通过散列值标识的,而钩子不能改变对象。

而除了操作对象本身之外,与推送相关的钩子在需要更新引用时也会调用。

  • pre-receive会接收所有需要更新的引用列表,包括其新旧对象指针。该钩子可以确认接受或拒绝所有变更
  • update钩子只在每个引用更新的时候调用一次。该钩子可以选择接受或拒绝单个分支的更新,而不影响其它分支是否更新。而对于每次更新,用户都能触发一个动作,比如发送邮件确认
  • post-receive钩子也会接收所有刚更新的引用列表。
  • post-update钩子已经被新的post-receive钩子替代了。

其它钩子

  • pre-rebase钩子在需要变基一个分支时调用,因此其能避免在不应该变基的分支上意外执行git rebase。
  • post-checkout钩子在切换分支或检出分支后调用,比如创建目录,检查检出文件的权限信息等
  • post-merge钩子在执行合并后调用
  • pre-auto-gc钩子可以帮助git gc --auto决定是否需要清理

Git版本控制管理——钩子相关推荐

  1. 《Git版本控制管理(第2版)》——4.3 Git在工作时的概念

    本节书摘来自异步社区<Git版本控制管理(第2版)>一书中的第4章,第4.3节,作者:[美]Jon Loeliger , Matthew McCullough著,更多章节内容可以访问云栖社 ...

  2. 【Git版本控制管理】Gitee(码云)和GitHub的使用

    远程仓库的使用 文章目录 远程仓库的使用 使用码云(Gitee) 使用GitHub 远程仓库是指托管在因特网或其他网络中的你的项目的版本库. 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读 ...

  3. java中git版本控制,git版本控制管理是什么?git如何实现版本控制?

    大家好,今天要跟大家讲的是关于git版本控制管理的一点小知识,git相信程序员小伙伴们都已经很熟悉了,很多项目开发都需要git,所以,git版本控制管理到底是干嘛的呢?Git又如何实现版本控制呢?下面 ...

  4. Git版本控制管理——远程版本库

    之前提到的Git的所有操作都是在本地完成的,而实际项目开发并不是一个人就可以搞定的,通常需要团队的协作,而这些协作可能又不是在同一个地区的,这就涉及到Git的分布式特性了. Git的分布式特定会涉及到 ...

  5. Git 版本控制管理(一)

    Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git  -- The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...

  6. Git版本控制管理——简介

    说明 在大型项目开发或者多人协作开发时,都希望可以对软件代码进行管理和追踪,以便确认开发的进度和方便问题追溯.这就需要使用到版本控制系统(VCS),比如Git就是一款很优秀的版本控制工具.如今很多项目 ...

  7. 3.git版本控制-管理修改、撤销、删除

    管理修改 第一次修改 -> git add -> 第二次修改 -> git commit,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交, ...

  8. Git版本控制管理(二)--git配置

    在系统上安装好 Git后,还需要配置Git 环境. 每台计算机上只需要配置一次,程序升级时会保留配置信息,也可以在任何时候再次通过运行命令来修改它们. 配置文件位置 Git 自带一个 git conf ...

  9. Git版本控制管理——版本库管理

    本文主要说明如何发布Git仓库. 发布版本库 对于Git来说,服务器并不是必需的.Git更乐于与同一台机器上的同级版本库直接交换文件,而不需要某个服务器来进行代理,或通过各种不需要上级服务器的协议与不 ...

最新文章

  1. python3.7导入gevent模块报错的解决方案
  2. MinHook - 最小化的 x86/x64 API 钩子库
  3. spring boot异常——java.net.BindException: Address already in use: bind
  4. 5年前的Dubbo,2年前的Spring Cloud,都输给了这个架构!
  5. 主从复制1062错误的解决方法
  6. python中RabbitMQ的使用(路由键模糊匹配)
  7. python关键词提取源码_Python 结巴分词 关键词抽取分析
  8. windows nginx c++读取请求数据_轻松应对百万并发的Nginx,搞懂LinuxC/C++这些技术栈升职加薪...
  9. oracle 分割字符成数组,oracle依据分隔符将字符串分割成数组函数
  10. 哈工大等提出轻量级盲超分辨模型LESRCNN,代码已开源
  11. Python—开始编程
  12. Dialog 基本使用
  13. 今日写代码遇到的https请求的时候,提示ssl证书错误
  14. spring注册bean
  15. c语言求ab的最大公约数,C语言中如何调用函数求最大公约数和最小公倍数
  16. PMP项目管理知识点:双因素理论
  17. 湖南师范大学2018年大学生程序设计竞赛新生赛 F-小名的回答
  18. 构建数字高程模型的算法——不规则三角网(TIN, Triangulated Irregular Network)
  19. doucument.referrer部分安卓机型一直为空问题
  20. 【python系列】使用mayavi画3d散点图

热门文章

  1. 人机对话比拼,Chat GPT和文心一言谁更接近真实交流?”
  2. java sql timestamp_java.sql.timestamp
  3. 类加载——类加载时机、类加载过程、类加载器
  4. 如何推动区块链与物联网深度融合,赋能数字化转型?
  5. Chrome 使用绿色版实现同一个机器 打开多个不同的chrome版本
  6. Oracle回收站机制
  7. Unity通过Animator获取动画clip时长
  8. traceroute出现*的分析
  9. 亮灯泡科技php,记科学小实验《灯泡亮了》
  10. 11 java 王少飞-Java语言的主要特性分析