使用 git hooks 自动部署博客

裸仓库文件被以修改的方式保存在数据库中, 如果我要使用这些文件, 比如部署博客, 还需要 clone 和 pull. 手动运行的话非常麻烦. git 提供了 hooks, 可以解决这个问题.

在裸仓库下找到 hooks 文件夹, 下面有一些例子, 其中, 我们需要用到的是 post-receive 这个.

注意
post-receive 是新的东西, 可能例子里没有, 它是用来替代 post-update 的方案.

post-receive 会在收到文件之后执行. 部署博客 (本质上是静态网页) 的话非常方便, 只需要把文件取出来就行. 剩下的交给 Nginx.

新建 post-receive, 输入以下内容:

#!/bin/sh
GIT_WORK_TREE=/your/dir git checkout -f

GIT_WORK_TREE 设置文件存放位置, 之后运行 git checkout -f 用来强制更新文件.

技巧
对于更复杂的应用部署, 需要执行其他功能, 直接在脚本文件中写 shell 命令即可.
注意
设置的位置需要 git 用户有权限. 同理其中执行的任何 shell 命令也都需要 git 用户具有相应的权限

UPD: 如果需要同时拉取 submodule, 则需要用下面这个奇怪的操作, 暂时不知道为什么反正能用就行…

git --git-dir=/path/to/your/bare/repo.git --work-tree=/your/dir -C /your/dir submodule update --init --recursive

UPD: 修改文件相关的命令, 如 git add, git commit, git pull 都要加上参数 --work-tree, 因为这些命令的对象就是 work tree. 这就不难理解 submodule 为啥要这样了. 参数 --git-dir 用来指定 *.git (裸) 仓库.