git hooks 自动部署网站
git的hook提供了非常大得自由度。 有commit发邮件啦。push后更新网站啦。做测试啦。无所不能。 所谓hook就是.git/hooks目录下得各种脚本。根据名字分别在不同情况下由git调用。这里post-receives是接收push结束后触发。
.git/hooks/post-receive
1 2 3 4 5 6 7 8 9 | #!/bin/sh
echo 'auto deploy'
git --git-dir=/path/blog.git/ --work-tree=/webroot/blog reset --hard
STAT=$?
if [ $STAT -eq 0 ]; then
echo 'deployed!'
else
echo "=口= something went wrong. $STAT"
fi
|
说起来被shell脚本坑了一道。[ $STAT -eq 0 ]
和[$STAT -eq 0]
是不一样的。
字符串比较和数字比较是不一样的。表达式还有圆括号、方框号、双圆括号、双方框号之分。
虽说shell script很不习惯,也可以用Python等其他脚本语言,但直接写命令进去还是最符合平时在shell中的操作。
比较有意思的是这句。git --git-dir=/path/blog.git/ --work-tree=/webroot/blog reset --hard
我得工作流是笔记本写好博文,生成静态文件,git commit然后push到服务器的bare仓库。通过bare仓库得钩子将文件更新到webroot。
因为webroot目录不是git仓库,所以就采取了这种以真正得git仓库为仓库(git-dir),把工作目录(work-tree)定为webroot然后reset的这种暴力方式。
如果你想,其实把webroot作为git得work-tree目录也行。要更直接。连hook都不用写了。
为什么不用rsync或者Capistrano?=。= 纯粹是因为懒。
当我只需要一个简单得更新文件得时候,不想牵扯到更多东西,既然git写个hook可以搞定,以后还可以随意扩展,就不想增加复杂性了。