自己写的网站,每次push代码后都要ssh进入服务器手动同步代码,不喜欢这样的重复劳动,索性使用git hooks来自动完成代码同步。
1. 创建仓库
在/home/yourname/repos/
目录下,运行git init --bare test.git
,在服务器端初始化一个远程的Git裸仓库。裸仓库里只有git索引,不包含工作目录。
通常来说,在Linux里Web项目是放在/var/www
目录之下,我们在这目录下clone上面建立的仓库。
cd /var/www
git clone /home/yourname/repos/project.git
2. 添加钩子
在裸仓库中Git钩子存放于,hooks
目录,如果是普通的git文件夹,则存放于.git/hooks
目录内,每个Git仓库都会这个文件夹,里面放置一些实例脚本,所有的实例脚本都是shell脚本,只要是正确命名的可执行脚本都能使用,Ruby、Python或其他语言也是可行的。
hooks
目录内默认包含如下文件。去掉文件后面的.example
即可使用,别忘了chmod +x
添加可执行权限。
➜ hooks git:(master) ls
applypatch-msg.sample pre-commit.sample prepare-commit-msg.sample
commit-msg.sample pre-push.sample update.sample
post-update.sample pre-rebase.sample
pre-applypatch.sample pre-receive.sample
文件名已经清楚地表述了每个钩子的作用。我们想做的是仓库被push后自动部署,所以要用到的是post-update
钩子,修改的钩子是在/home/yourname/repos/project.git
仓库里的钩子,不要修改到/var/www/project
里了
3. 修改钩子
先用cp post-update.sample post-update
复制一个新文件,再编辑此文件。每一行命令都已添加注释
# 进入项目目录
cd /var/www/project
# 获取仓库里的新提交
git fetch /home/yourname/repos/project.git
# 将代码与仓库同步,抛弃当前所有修改
git clean -f
git reset --hard origin/master
## 以下指令适用于laravel项目,可根据项目自由修改
# 更新依赖包
composer install
npm install
php artisan migrate
# 前端项目按生产环境生成前端文件
npm run production
最后一行命令如果遇到权限问题,则需要将用户添加到www-data中。使用命令usermod -G www-data yourname
,并在最后一行添加chgrp www-data . -R