在这之前,部署网站代码到服务器,用的都是 FTPSCPSFTP 等等之类的工具,使用起来不够方便。无意中看到关于使用 Githooks 方式上传代码的,就亲自试了下,很香,这里记录一下。

首先,到要承载仓库的服务器上创建用来维护仓库的用户

1
2
useradd user1
echo "somepassword" | passwd --stdin user1

然后,切换到该用户,并进入家目录(这里可以浏览到你自己想放代码库的地方)

1
2
su user1
cd

创建一个裸库(即没有工作区的库,但是可以正常 pushcheckout 等)

1
git init --bare blog.git

再创建一个 Git 仓库,用来从上面创建的裸库中拉取代码,此处我们使用 git clone 的方式

1
git clone blog.git blog_src

进入 blog.git 仓库的 hooks 文件夹,并创建钩子文件 post-receive,写入脚本代码,关闭保存后,赋予该文件可执行权限

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
cd blog.git/hooks
vim post-receive

#!/usr/bin/bash

#x:打印每条命令;e:有错误就退出
set -xe

export GIT_WORK_TREE=/xxxx/xxxx/blog_src #临时环境变量,不会影响其他git仓库
export GIT_DIR=${GIT_WORK_TREE}/.git #临时环境变量,不会影响其他git仓库

cd ${GIT_WORK_TREE}
#拉取origin的代码
git fetch origin
#使本仓库的代码与blog.git仓库的代码保持一致
git reset --hard origin/master
1
chmod u+x post-receive #赋予可执行权限

到此,服务器端配置完成,下面到本地,利用 SSH 将代码 PUSH 到服务器。首先创建 SSH连接

1
2
ssh-keygen
ssh-copy-id user1@xxx.xxx.xxx.xxx -P 12345 #如果修改了SSH的连接端口,需要加 -P 参数;这里注意服务器sshd要开启密码认证

创建连接成功后,可以配置本地 git 仓库

1
2
3
git remote add blog ssh://user1@xxx.xxx.xxx.xxx:12345/xxx/xxx/blog.git
#如果没有修改ssh端口,也可以如下
#git remote add blog user1@xxx.xxx.xxx.xxx:/xxx/xxx/blog.git

提示成功后,就可以推送代码到服务器了

1
2
3
git add .
git commit -m "xxxxx"
git push blog master

然后,我们可以去服务器的 blog_src目录下查看,如果本地上传的文件,都已经在该目录下存在,就说明配置成功。

注意:该目录的拥有者为 user1 , 启动 nginx 服务器的用户一定要有权限操作该目录。可以修改 nginx 配置文件中的userroot。 而对于 apache 来说,它需要的目录权限是 755 ,然后 apache 需要父层文件夹都具有 x 权限,而如果在用户的家目录的话,用户目录是没有执行权限的,因此会报 403 错误 (nginx 是可以设置在家目录的,前提是把 user 修改为 root)。综上所述,还是不建议在家目录创建网站目录,可以存放在 /var/www/blog_src 这样的目录,创建好目录,自动就满足权限要求。