git hooks
如同 flask
框架的请求钩子一样,git
也有钩子 (hook
) 的概念,下面就让我们一起来看看吧。
1.概念
执行某些命令前后,统一进行的操作。比如我要在每次 commit
前核查代码,就可以使用钩子 pre-commit
。
2.分类
1.客户端钩子:提交或者合并时,在客户端进行的操作。
2.服务端钩子:接收推送时,在服务器端进行的操作。
3.原理
这些钩子本质上是一些脚本,在执行特定命令时调用这些脚本以达到目的。更多精彩文章请关注公众号『Pythonnote』
大家可以在任意一个 git
管理的仓库下 .git/hooks
目录中找到官方示例。
╰─❯ ls # cd .git/hooks
applypatch-msg.sample fsmonitor-watchman.sample preapplypatch.sample pre-push.sample pre-receive.sample update.sample
commit-msg.sample post-update.sample pre-commit.sample pre-rebase.sample prepare-commit-msg.sample
当你查看这些示例时,会发现他们其实就是一些
shell
脚本,也会包含一些其他语言的代码,如perl
。 语言不限定,甚至可以使用Python
编写它们。
4.使用
如果想体验一下官方示例,可以将官方示例的钩子脚本后缀名删掉,这样它就被激活了。
mv pre-commit.sample pre-commit
4.1 示例
我希望在每次 commit
前输出一句话:
this is pre-commit hook
步骤:
1.将官方示例进行备份
cp pre-commit.sample pre-commit.sample.bak
2.修改 pre-commit
钩子脚本
vim pre-commit.sample
#!/bin/sh
echo 'this is pre-commit hook'
3.激活钩子
mv pre-commit.sample pre-commit
4.在仓库做一些改变然后进行提交
# ... do something
git add .
git commit -m 'test hooks'
5.输出信息如下
从图中可以看到执行了我们的脚本。
5.客户端常用的 hooks
5.1 pre-commit
在执行 git commit
键入提交信息前运行,如果脚本输出非零值,那么就会停止提交。关注公众号『全栈技术精选』
用途:做初步的 code review
,检查代码风格是否符合规范;检查代码是否有多余空白字符等等。
5.2 post-commit
在整个提交过程完成后运行。
用途:提示信息。
5.3 pre-push
在 git push
运行期间, 更新了远程引用但尚未传送对象时被调用。它接受远程分支的名字和位置作为参数,同时从标准输入中读取一系列待更新的引用。如果脚本输出非零值,那么就会停止推送。关注公众号『Pythonnote』或者『全栈技术精选』
用途:在推送开始之前,用它验证对引用的更新操作。
5.4 post-merge
在 git merge
成功运行后,post-merge
钩子会被调用。
用途:可以用它恢复 Git 无法跟踪的工作区数据,比如权限数据。这个钩子也可以用来验证某些在 Git 控制之外的文件是否存在,这样你就能在工作区改变时,把这些文件复制进来。
- 金格科技iMsg2000消息数据格式
- IE10预览:HTML5初探 翻译自Sencha
- 免插件仅代码实现WordPress评论回复邮件
- ASP.NET Core 1.1 简介
- 使用 Roslyn 编译器服务
- ExtJS4预览:渲染过程重构和标准化
- Ext JS 4预览:更快、更简单、更稳定
- VR技术的进步推动工业机器人革命
- tLinux 2.2下安装Mono 4.8
- WordPress评论回复邮件样式美化教程
- 基于Aspose.Pdf把pdf文件每一页转换为图片
- 分布式文件存储的数据库开源项目MongoDB
- 使用 JavaScriptService 在.NET Core 里实现DES加密算法
- 拒绝全英文垃圾评论!仅用代码实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 准时下班的秘密:集成 GitLab && JIRA 实现自动化 workflow
- ZLT-MP v4.1.0 发布
- 高并发系统三大利器之限流
- XtraBackup工具详解 Part 2 xtrabackup安装
- XtraBackup工具详解 Part 4 XtraBackup权限及配置
- XtraBackup工具详解 Part 5 使用innobackupex对数据库进行全备
- XtraBackup工具详解 Part 6 使用innobackupex对全备进行恢复
- [修正]XtraBackup工具详解 Part 6 使用innobackupex对全备进行恢复
- XtraBackup工具详解 Part 7 使用innobackupex对数据库进行增量备份
- XtraBackup工具详解 Part 8 使用innobackupex对增量备份进行恢复
- MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制
- MySQL复制全解析 Part 3 MySQL半同步复制设置
- MySQL 复制全解析 Part 4 使用备库搭建MySQL复制
- MySQL复制全解析 Part 5 MySQL GTID的格式和存储
- MySQL复制全解析 Part 6 MySQL GTID 生命周期