使用 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
(裸) 仓库.