• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

Git 仓库的 hook 钩子的使用

Git 钩子

和其它版本控制系统一样,Git 钩子其实就是在特定的重要动作发生时触发的自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。

钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。这些脚本除了本身可以被调用外,它们还透露了被触发时所传入的参数。 所有的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它语言编写它们。 这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。

把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中,即可激活该钩子脚本。 这样一来,它就能被 Git 调用。

客户端钩子

客户端钩子分为很多种。 下面把它们分为:提交工作流钩子、电子邮件工作流钩子和其它钩子。

  • pre-commit,当执行commit动作时先执行此hook,可以用此hook做一些检查,比如代码风格检查,或者先跑测试。

  • prepare-commit-msg, 当commit时需要输入message前会触发此hook,可以用此hook来定制自己的default message信息。

  • commit-msg,当用户输入commit的message后被触发,可以用此hook校验message的信息,比如是否符合规定,有没有cr等。

  • post-commit, 当commit完成后被触发,可以用此hook发送notification等。

  • pre-rebase, rebase之前会被触发,可以用此hook来拒绝所有的已经push的commits进行rebase操作。

  • post-merge, 当merge成功后,会触发此hook。

  • pre-push, 当push时,remote refs被更新,但是在所有的objects传输前被触发。

  • pre-auto-gc, 当git gc --auto执行前被触发。在垃圾回收之前做一些验证或备份是挺不错的。

服务端钩子

  • pre-receive, 当收到push动作之前会被执行。

  • update, 也是收到push动作之前被执行,但是有可能被执行多次,每个branch一次。

  • post-receive, 当push动作已经完成的时候会被触发,可以用此hook来push notification等,比如发邮件,通知持续构建服务器等。

示例

当更新版本库后,进行web页面的实时更新。

#!/bin/sh
#此目录为nginx服务器站点代码
DIR=/home/wwwroot/default 
#demo-brancd 表示demo分支,不写默认master分支
git --work-tree=${DIR} clean -fd demo-brancd  
git --work-tree=${DIR} checkout --force demo-brancd


注意:

如果脚本中有些命令不在系统默认的 PATH 中,那么需要本中把命令路径加入到 PATH脚本不继承你在 /etc/profile 中定义的环境变量




0
0
下一篇:git 中 fatal: Authentication failed 的解决方法

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。