## 8.3 Git 钩子
### 8.3.1 安装一个钩子
钩子都被存储在 Git 目录下的`hooks`子目录中。用`git init`初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。把一个正确命名且可执行的文件放入 Git 目录下的`hooks`子目录中,即可激活该钩子脚本。
### 8.3.2 客户端钩子
客户端钩子分为很多种。 下面把它们分为:提交工作流钩子、电子邮件工作流钩子和其它钩子。
**提交工作流钩子**
* `pre-commit`钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。
* `prepare-commit-msg`钩子在启动提交信息编辑器之前,默认信息被创建之后运行。 它允许你编辑提交者所看到的默认信息。
* `commit-msg`钩子接收一个参数,存有当前提交信息的临时文件的路径。
* `post-commit`钩子在整个提交过程完成后运行。 它不接收任何参数,一般用于通知之类的事情。
**电子邮件工作流钩子**
* `applypatch-msg`** **接收单个参数,包含请求合并信息的临时文件的名字。可以用该脚本来确保提交信息符合格式,或直接用脚本修正格式错误。
* `pre-applypatch` 在`git am`运行期间被调用,以用这个脚本运行测试或检查工作区。 如果有什么遗漏,或测试未能通过。
* `post-applypatch`运行于提交产生之后,是在`git am`运行期间最后被调用的钩子。 可以用它把结果通知给一个小组或所拉取的补丁的作者。
**其它客户端钩子**
* `pre-rebase`钩子运行于变基之前,可以使用这个钩子来禁止对已经推送的提交变基。
* `post-rewrite`钩子被那些会替换提交记录的命令调用。
* `post-checkout` 钩子在`git checkout`成功运行后调用,可以根据项目环境用它调整工作目录。
* `post-merge`钩子在`git merge`成功运行后调用,可以用它恢复 Git 无法跟踪的工作区数据。
* `pre-push`钩子会在`git push`运行期间, 更新了远程引用但尚未传送对象时被调用。
* `pre-auto-gc`钩子会在垃圾回收开始之前被调用。
### 8.3.3 服务器端钩子
* `pre-receive`处理来自客户端的推送操作时,它从标准输入获取一系列被推送的引用。可以用这个钩子阻止对引用进行非快进(non-fast-forward)的更新,或者对该推送所修改的所有引用和文件进行访问控制。
* `update`脚本和`pre-receive`脚本十分类似,不同之处在于它会为每一个准备更新的分支各运行一次。 假如推送者同时向多个分支推送内容,`pre-receive`只运行一次,相比之下`update`则会为每一个被推送的分支各运行一次。
* `post-receive`挂钩在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。
- 介绍
- 第一章 起步
- 1.1 关于版本控制
- 1.2 Git 简史
- 1.3 Git 基础
- 1.4 命令行
- 1.5 安装 Git
- 1.6 初次运行 Git 前的配置
- 1.7 获得帮助
- 第二章 基础
- 2.1 获取仓库
- 2.2 记录每次更新到仓库
- 2.3 查看提交历史
- 2.4 撤销操作
- 2.5 远程仓库的使用
- 2.6 打标签
- 2.7 Git 别名
- 第三章 分支
- 3.1 分支简介
- 3.2 分支的新建与合并
- 3.3 分支管理
- 3.4 分支开发工作流
- 3.5 远程分支
- 3.6 变基
- 第四章 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上搭建 Git
- 4.3 生成 SSH 公钥
- 4.4 配置服务器
- 4.5 Git 守护进程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的选择
- 第五章 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一个项目贡献
- 5.3 维护项目
- 第六章 GitHub
- 6.1 账户的创建和配置
- 6.2 对项目做出贡献
- 6.3 维护项目
- 6.4 管理组织
- 6.5 脚本 GitHub
- 第七章 Git 工具
- 7.1 选择修订版本
- 7.2 交互式暂存
- 7.3 储藏与清理
- 7.4 签署工作
- 7.5 搜索
- 7.6 重写历史
- 7.7 重置揭密
- 7.8 高级合并
- 7.9 Rerere
- 7.10 使用Git调试
- 7.11 子模板
- 7.12 打包
- 7.13 替换
- 7.14 凭证存储
- 第八章 自定义 Git
- 8.1 配置 Git
- 8.2 Git 属性
- 8.3 Git 钩子
- 8.4 使用强制策略的一个例子
- 第九章 Git 与其他系统
- 9.1 作为客户端的 Git
- 9.2 迁移到 Git
- 第十章 Git 内部原理
- 10.1 底层命令和高层命令
- 10.2 Git 对象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用规格
- 10.6 传输协议
- 10.7 维护与数据恢复
- 10.8 环境变量
