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 条评论