layout | title | tags |
---|---|---|
post |
使用git部署远程服务器 |
git |
本地开发完成后,通常会在服务器上部署,坦白的说我见过并且用过 vnc + winscp + hg pull/update
方式, 可悲的是需要在四台服务器上全部执行一遍.
后来采用 ssh + pull, 但并是仍然比较繁琐. 上面的问题可以通过ssh
直接远程执行命令来解决,但是需要写一些shell
脚本...
在学习 git 时候,发现了 git 具有 'hook'机制, 使用版本版本管理工具的hook
! 其实其他版本工具,如 svn
、git
、hg
都是有相应的hook
的, 原理大同小异。下面是Git详细的思路。
和其他版本控制系统一样,在某些关键节点,Git 可以调用自定义脚本。分为两组挂钩:客户端和服务器端。客户端挂钩用于客户端的操作,如提交和合并。服务器端挂钩用于 Git 服务器端的操作,如接收被推送的提交。可以随意地使用这些挂钩。
挂钩都被存储在 Git 目录下的 hooks 子目录中,即大部分项目中的 .git/hooks。 Git 默认会放置一些脚本样本在这个目录中,除了可以作为挂钩使用,这些样本本身是可以独立使用的。所有的样本都是 shell 脚本,不过,任何正确命名的可执行脚本都可以正常使用 — 可以用Ruby或Python,或其他。这些样本名都是以 .sample 结尾,因此,你必须重新命名。
把一个正确命名且可执行的文件放入 Git 目录下的hooks子目录中,可以激活该挂钩脚本,因此,之后他一直会被 Git 调用。随后会讲解主要的挂钩脚本。
.git/hooks \
├── update # 更新时执行
├── commit-msg # 提交
├── applypatch-msg.sample # 带有sample缀,不执行
├── post-update.sample
...
首先创建一个裸库(empty Git repository),为什么是裸库?因为这个库不是真正用来修改的,我们也不允许在服务器上修改代码,我们只是把它当作一个代码中转的地方
cd gitroot
mkdir projectname
cd projectname
git init --bare
可以看到它的目录结构与普通版本库存在差异:把原本在 .git 文件夹的内容移到了根目录,去掉了 .git 文件夹。
添加我们的 hook
cd /hooks
touch post-receive
编辑post-receive
的内容为下面的,其中sites/projectname
,是我们存放代码地方
env -i git archive master | tar -x -C /sites/projectname
echo "远程更新完毕"
本地我们只需要添加一个远程库,在需要部署的时候 push
到远程库就行了,下面我们添加了一个名为publish
的远程库
git remote add publish [email protected]:/home/gitroot/projectname
git push publish master
还可以添加静态资源版本更新,服务器重启,代码编译等等