需求: 使用Git Hook进行web资源的更新

Git Hook 简介

一般的开发流程都是git addgit commitgit push,钩子呢就是你完成每一步Git给你的“回调”,举个例子假如你想让服务器每次上传完新的代码后更新网站,如果你没有钩子,你只能自己ssh登录上服务器,自己更新软件,一次两次还好,多了的话你会骂娘的,所以钩子是给我偷懒的脚手架,我们可以很轻松的写一些脚步帮我们完成一些重复的步骤

介绍玩钩子的作用,我们来介绍一下钩子的分类

我们知道Git核心是commitpush两个命令,一个对应客户端,一个对应服务端,所以钩子主要分客户端和服务端,由于Git步骤分的很细,所以每个大分类下面还有很多小分类,比如pre-commitpost-commit这些。

钩子的全部放在.git/hooks下面,在新建一个项目仓库的时候,Git已经在这个文件夹下给我们生成了很多个.sample后缀的钩子,这些钩子只要把.sample去掉就可以运行了,我们可以在这些sample上面修改完成我们自己的钩子

客户端钩子

  • pre-commit: 执行git commit命令时触发,常用于检查代码风格
  • prepare-commit-msg: commit message编辑器呼起前default commit message创建后触发,常用于生成默认的标准化的提交说明
  • commit-msg: 开发者编写完并确认commit message后触发,常用于校验提交说明是否标准
  • post-commit: 整个git commit完成后触发,常用于邮件通知、提醒
  • applypatch-msg: 执行git am命令时触发,常用于检查命令提取出来的提交信息是否符合特定格式
  • pre-applypatch: git am提取出补丁并应用于当前分支后,准备提交前触发,常用于执行测试用例或检查缓冲区代码
  • post-applypatch: git am提交后触发,常用于通知、或补丁邮件回复(此钩子不能停止git am过程)
  • pre-rebase: 执行git rebase命令时触发
  • post-rewrite: 执行会替换commit的命令时触发,比如git rebasegit commit --amend
  • post-checkout: 执行git checkout命令成功后触发,可用于生成特定文档,处理大二进制文件等
  • post-merge: 成功完成一次 merge行为后触发
  • pre-push: 执行git push命令时触发,可用于执行测试用例
  • pre-auto-gc: 执行垃圾回收前触发

服务端钩子

  • pre-receive: 当服务端收到一个push操作请求时触发,可用于检测push的内容
  • update: 与pre-receive相似,但当一次push想更新多个分支时,pre-receive只执行一次,而此钩子会为每一分支都执行一次
  • post-receive: 当整个push操作完成时触发,常用于服务侧同步、通知

配置git hook触发,本地客户端更新push触发服务端自动拉取更新资源

1
cp -a  hooks/post-receive.sample hooks/post-receive
1
2
3
4
5
6
cat hooks/post-receive # vi编辑
#!/bin/sh

unset GIT_DIR
/usr/bin/sudo su - apps
ssh apps@10.4.0.173 "cd /data/lt1/app/qjj && git pull origin master"

本地使用

1
git clone xxxx
后续走git 流程进行推送,便实现自动更新。

参考资料