Skip to content

Latest commit

 

History

History
72 lines (48 loc) · 2.9 KB

2013-12-29-利用git快速部署远程服务器.md

File metadata and controls

72 lines (48 loc) · 2.9 KB
layout title tags
post
使用git部署远程服务器
git

本地开发完成后,通常会在服务器上部署,坦白的说我见过并且用过 vnc + winscp + hg pull/update 方式, 可悲的是需要在四台服务器上全部执行一遍.

后来采用 ssh + pull, 但并是仍然比较繁琐. 上面的问题可以通过ssh直接远程执行命令来解决,但是需要写一些shell脚本...

在学习 git 时候,发现了 git 具有 'hook'机制, 使用版本版本管理工具的hook! 其实其他版本工具,如 svngithg都是有相应的hook的, 原理大同小异。下面是Git详细的思路。

Git Hook

和其他版本控制系统一样,在某些关键节点,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 "远程更新完毕" 

本地git的操作

本地我们只需要添加一个远程库,在需要部署的时候 push 到远程库就行了,下面我们添加了一个名为publish的远程库

git remote add publish [email protected]:/home/gitroot/projectname
git push publish master

可以强化的地方

还可以添加静态资源版本更新,服务器重启,代码编译等等