在没有接触到Git Hook之前,我一直都是在本地将代码push到远程仓库,然后再ssh到服务器上git pull,想起来都心酸。这样手工操作不仅繁琐,还非常容易出错。好在Git为我们提供了hook这种好东西,能够在特定的事件触发时执行我们写好的脚本,实现自动化部署。

配置Git仓库


在服务器上创建一个裸仓库

首先要在服务器上建立一个裸仓库,假设我们用于存放裸仓库的文件夹是/home/user/repos/,进入到该文件夹,然后使用git init --bare test.git创建裸仓库,这样我们就有了一个叫test.git的裸仓库啦。

在服务器上创建一个普通Git仓库

接下来就是在服务器上建立一个普通Git仓库,用于存放网站的源代码。

1
2
3
4
mkdir /home/user/www
cd /home/user/www
git init
git clone ~/repos/test.git

配置Git Hook

进入到~/repos/test.git/hooks文件夹,使用vi post-receive创建一个脚本,当你在本地仓库执行git push后就会触发post-receive关于Git Hok)。
post-receive的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh

unset GIT_DIR

NowPath=`pwd`
DeployPath="../../www"

cd $DeployPath
git add . -A && git stash
git pull origin master

#下面两步是我的Node.js应用配置,需要按照你的实际情况改动
npm install #安装npm包
pm2 restart server #使用pm2重新启动应用

cd $NowPath
echo "deploy done"
exit 0

默认的情况下,脚本是无法执行的,所以我们需要为这个脚本添加可执行权限
chmod +x post-receive

本地仓库配置


这里的本地仓库就是你本机的仓库,不再是服务器上的了。我们要在原有的Git项目中加入一条新的remote源,以后往这个源推送代码就会自动部署了。

1
2
git remote add prod user@ip_address/repos/test.git
git push prod master