初识 Git hook钩子

之前使用git一直停留在比较浅的层面,最近涉及部署的相关东西的时候接触到了Git的hook,感觉这个东西非常有趣,下面总结一下我对Git中hook的认识以及分享一下我使用git的hook部署hexo博客到服务器上的过程。

hook

概念

Git钩子是仓库中特定事件发生时Git自动运行的普通脚本。每当我们创建一个仓库的时候,我们仓库的.git/hooks目录中有一些示例脚本。
这些脚本可以是任何脚本语言编写的,只要它们最后能编译到可执行文件。每次脚本中的#!/bin/sh定义了你的文件将被如何解释。

pre-receive

git有非常多的本地钩子和服务端钩子,因为这次我使用的主要是pre-receive来部署博客,所以介绍一下pre-receive钩子,更多的钩子信息可以在文章最后的参考信息中查看
pre-receive钩子在有人用git push向仓库推送代码时被执行。它只存在于远端仓库中,而不是原来的仓库中。
所以我们可以用来在hexo提交更新的时候对服务器上的相关资源进行更新

使用 Git hook 自动部署 Hexo博客

创建远程仓库

首先我们要在服务器器创建一个管理内容的仓库:

1
2
3
sudo mkdir /var/repo
cd /var/repo
sudo git init --bare blog.git

这里使用了 –bare 参数,是为了创建一个裸仓库,没有工作区。我们不会在裸仓库上进行操作,它只为共享而存在。
后面在hook的设置中会讲到工作区的设置

配置hook

因为是在push操作时才发生的事件所以使用post-receive钩子,钩子将在git操作完以后运行
在blog.git/hooks 目录下新建一个post-receive文件:

1
2
cd /var/repo/blog.git/hooks
vim post-reveive

在post-receive中写入以下内容

1
2
#!/bin/sh
git --work-tree=/var/www/hexo --git-dir=/var/repo/blog.git checkout -f

注意,/var/www/hexo 要换成你自己的部署目录,一般可能都是 /var/www/html。上面那句 git 命令可以在我们每次 push 完之后,把部署目录更新到博客的最新生成状态。这样便可以完成达到自动部署的目的了。
同时加上可执行权限

1
chmod +x post-receive

本地配置

修改 hexo 目录下的 _config.yml 文件 ,使得hexo博客可以自动deploy到服务器上:

1
2
3
4
deploy:
type: git
repo: git@www.example.com:/var/repo/blog.git
branch: master

切换服务器地址和目录为你自己的服务器的地址和目录

结果

此时你创建新的文章的时候就可以通过git hook来进行自动部署了,而不需要使用GitHub page的相关服务了


参考:
https://github.com/geeeeeeeeek/git-recipes/wiki/5.4-Git%E9%92%A9%E5%AD%90%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BD%A0%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81