目前我服务器上部署了多个服务程序,为了实现本地一键推送+自动部署到功能,基于Git的钩子功能实现了一套解决方案。
创建本地仓库
在本地项目文件夹testProject下执行:
1 | git init |
创建master分支
1 | git add * |
master分支需要在初次commit以后才能创建。
创建远程仓库
在远程服务器创建文件夹:testProject.git
1 | git init --bare |
在testProject.git/hooks/下创建post-receive文件:
1 | echo "post-receive hook is running..." |
具体内容根据需求编写,我通常会按照上面的模板编写,将要执行的命令脚本再单独写在项目中的一个run.sh脚本下,远程推送后只需执行该脚本就行了。这样以后我要修改推送后执行的命令,只需要修改本地项目中的run.sh即可,就不用去改动远程仓库里的代码。
在模板中执行了一次将项目克隆到一个临时文件夹,在将临时文件夹中的内容复制到指定文件夹中的操作,如此迂回一下是为了在cp
的过程中略过.git
文件夹,以隐藏项目的历史信息,适用于项目中的文件要对外透出的场景,如静态页面的部署。
创建好以后记得赋予可执行权限:
1 | chmod +x post-receive |
从文件的名字中不难理解,该脚本文件将会在远程仓库接收完推送内容后触发执行。类似的,仓库的/hooks
文件夹下还有基于更多触发时机的脚本模板,可以根据自己的需求算则使用。
1 | applypatch-msg.sample fsmonitor-watchman.sample post-update.sample pre-commit.sample prepare-commit-msg.sample pre-rebase.sample update.sample |
推送本地仓库到远程
第一次推送执行如下命令:
1 | git push --set-upstream root@siriyang.cn:/home/root/testProject.git master |
之后每一次直接执行git push
即可。1
2
3git add * # 提交所有文件或者指定文件到缓冲区
git commit -m 'xxx' # 提交修改并备注修改内容
git push # 推送到远程仓库