要求
实现git push
直接完成代码部署到服务器的目录
实现方式
利用git
的hooks中的post-receive
来实现代码提交完成之后的动作。将仓库指定一个--work-tree
然后进行检出操作checkout --force
目录结构
我自己的项目结构是这样的,每一个仓库对应一个项目,例如public/wx
项目对应repo/wx.git
仓库
.
├── public
│ └── wx // 这是我们的web代码部署目录
│ ├── index.php
│ ├── test2.php
│ ├── test3.php
│ └── test.php
└── repo // 这个是我们的仓库目录
└── wx.git // 这个对应wx项目的仓库
├── branches
├── config
├── description
├── HEAD
├── hooks // post-receive钩子代码写在这里面
├── index
├── info
├── objects
└── refs
再看下hooks文件目录
.
├── applypatch-msg.sample
├── commit-msg.sample
├── post-commit.sample
├── post-receive
├── post-receive.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-rebase.sample
└── update.sample
我们将post-receive.sample
复制一份post-receive
,并且编写代码如下
# 指定我的代码检出目录
DIR=/www/public/wx
git --work-tree=${DIR} clean -fd
# 直接强制检出
git --work-tree=${DIR} checkout --force
如何生成目录
上面看到的repo目录中的wx.git
实际上是一个裸仓库,我们用下面的命令来生成这样一个仓库。
cd /www/repo
git init --bare wx.git
对于代码部署目录和仓库我们已经通过post-receive
进行了关联了,因为我们一旦将代码push到仓库,那么会自动检出到publish/wx
目录下。
远程部署
在本地电脑上,我们添加远程仓库
git init
git remote add origin root@xxx.xxx.xxx.xxx:/www/repo/wx.git
这个时候我们添加了远程仓库,那么我们来测试下push
操作
touch index.php
git add .
git commit -m 'test'
git push
可能会提示一个--set-upstream
,直接执行下就好了。执行完之后我们登陆服务器,会发现文件已经出现在public/wx/index.php
注意点
- 如果我们没有配置
ssh免密码登陆
的话,我们需要在push
代码的时候输入密码 - 如果我们添加的远程仓库不是
root@xxx.xxx.xx.xx
,例如是abc@xx.xx.xx.xx
,那么我们要确保abc
用户对wx.git
目录下的文件有777
权限。
新增仓库
- 需要登陆远程服务器进行初始化
repo_name.git
仓库 - 需要手动创建
public/repo_name
文件夹,并且修改权限为777 - 需要重新编写
hooks/post-recieve
文件,修改里面的DIR路径为public/repo_name