赞
踩
Git中的钩子可以理解为一个特殊动作触发的脚本。
任何时候当版本库中出现如提交或补丁等特殊事件时,都会触发执行一个或多个任意的脚本。通常情况下,一个事件会分解为多个规定好的步骤,可以为每个步骤绑定自定义脚本。当Git事件发生时,每一步开始都会调用相应的脚本。
钩子只属于并作用于一个特定的版本库,在克隆操作中不会复制。换句话说,在私有版本库中设置的钩子不会传送到新克隆的版本库,也就不会改变新克隆的仓库的行为。而如果真的有需要的话,则需要获取被克隆版本库的.git/hooks目录。
一个钩子既可以在当前本地版本库的上下文中运行,也可以在远程版本库的上下文中运行。大多数Git钩子属于两类:
通常情况下,如果前置钩子以非零状态推出,即异常,那么Git的动作会终止,而后置钩子的总是在Git操作后执行,因此其状态总是会被忽略。
从上面的描述来看,钩子的特性有:
每个钩子简单地说都是一个脚本,作用于一个特定版本库的钩子集合都位于.git/hooks目录下。不过既然是脚本,就应该遵循UNIX脚本的基本规范,文件本身是可执行的和文件首行应指明脚本使用的语言。
每个钩子都是以它相关联的事件命名的。如在git commit操作之前执行的钩子称为.git/hooks/pre-commit。
在创建新的版本库时,钩子是自动复制自本地的Git模板目录的。比如Windows中的Git模板来自Git\mingw64\share\git-core\templates\hooks这个目录。绝大多数Git版本都包含用户可以使用的一些钩子,并会预装到模板目录下。
对于模板钩子来说:
可执行git help hooks查看Git当前版本总可用的钩子。
所有提交钩子都是为git commit服务的,但git rebase/git merge/git am都默认不执行提交钩子,然后git commit --amend会执行提交钩子。
当执行git commit时,Git会执行上图的过程:
当执行git am时,Git会执行上图的过程:
当执行git push时,Git的接收端会执行上图的过程。
所有与推送相关的狗子都在接收端执行,而不是发送端。因此,执行的钩子脚本是在接收端的.git/hooks目录下运行,而不是在发送端。远程钩子的输出结果会显示给执行git push的用户。
而git push的第一步是将本地版本库中所有缺少的对象传输到远程版本库中,此时不需要钩子,因为所有的Git对象都是通过散列值标识的,而钩子不能改变对象。
而除了操作对象本身之外,与推送相关的钩子在需要更新引用时也会调用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。