服务器端准备工作:
1. 安装git
1 | apt-get install git |
2. 为了安全,新建一个专门用于代码部署的无特权用户
1 2 3 | useradd -m git #设置该用户的密码 passwd git |
3. 新建一个目录作为要部署代码的根目录,如:
1 | mkdir /var/www/git/item.git |
4. 将这个目录的属主和属组都改为上面新建的用户git
1 2 | cd /var/www/git chown git:git item.git |
5. 切换到部署代码的专用用户
1 | su git |
6. 进入项目根目录,初始化为git仓库
1 2 | cd item.git git init Initialized empty Git repository in /var/www/git/item.git/.git/ |
7. 必要的配置
1 2 3 4 5 6 7 8 | #让仓库接受代码提交 git config receive.denyCurrentBranch ignore #可选 git config core.worktree ~/www #可选,禁止强制推送 git config --bool receive.denyNonFastForwards false |
注意!
我们可以在自己的服务器上创建git仓库,有两种方式:
git –bare init (裸仓库)
git init
两者区别:
1,普通git仓库的目录结构就和你的代码目录结构一致,只多了.git目录,.git目录中包含了git的一些配置等数据
2,裸仓库只保存了一些配置信息等,肉眼是找不到我们所上传的代码的
额外说明:用”git init”初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。比如有用户在该目录(就称为远端仓库)下执行git操作,且有两个分支(master 和 b1),当前在master分支下。另一个用户想把自己在本地仓库(就称为本地仓库)的master分支的更新提交到远端仓库的master分支,他就想当然的敲了git push origin master:master于是乎出现错误 ,因为远端仓库的用户正在master的分支上操作,而你又要把更新提交到这个master分支上,当然就出错了。
确定一个repository是否为bare库的关键在于core.bare属性(boolean型属性)。core.bare属性可以有git config命令设置,也可以通过修改config文件的方式设置,conf文件指的就是当前库下面的conf配置文件,如果这里 bare = true 那么即使有.git文件夹也还是不能进行相关操作。 如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset –hard才能看到push后的内容.
本地仓库准备工作:
1. 通过 git clone 或 git pull 从仓库上将代码获取到本地
1 2 3 4 | Administrator@PC-20170526BRPS MINGW32 /d/www/git $ git clone git@t.024ea.com:/var/www/git/item.git Cloning into 'item'... git@t.024ea.com's password: warning: You appear to have cloned an empty repository. |
接下来接个phpstrom编辑更改代码提交,就简单了。
git利用post-receive自动化部署:
1. 更新服务端 git 仓库状态并检出文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | cd /var/www/git/item.git git update-server-info git checkout -f # OR: # 如果push的不是master分支 # git checkout branch_name $ ls new.html $ cat new.html #已经能看到提交文件 hello new git! |
2.设置服务器钩子
1 2 3 4 5 6 | #仓库配置文件 cd /var/www/git/item.git/.git/hooks #默认没有这文件,新建了一个 touch post_receive vim post_receive |
shell脚本
1 2 3 4 5 6 7 8 9 10 | #!/bin/sh chown www-data /var/www/git/item.git -R DEPLOY_PATH=/var/www/git/item.git unset GIT_DIR #这条命令很重要 cd $DEPLOY_PATH git reset --hard git pull chown www-data -R $DEPLOY_PATH chgrp www-data -R $DEPLOY_PATH |
关于unset GIT_DIR的说明:
经过查找资料,如过没有unset命令,在文件中添加 git pull 时会报错,提示:”fatal: Not a git repository: ‘.'”。hook脚本执行了cd之后,继续执行git语句拉取的时候还是在hooks文件夹下,而不是cd的文件路径。git的hooks里面默认有一些环境变量,会导致无论在哪个语句之后执行git命令都会有一个默认的环境路径,既然这样unset 掉默认的GIT环境变量就可以了。
参考:http://alfred-long.iteye.com/blog/1836347
补充
关于本地第一次使用clone命令无法使用git用户登陆,需要先使用命令ssh-keygen,参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | root@office-host-ubuntu:/var/www/git# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /home/git/.ssh/id_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/git/.ssh/id_rsa. Your public key has been saved in /home/git/.ssh/id_rsa.pub. The key fingerprint is: SHA256:eXBtsym+2BZfcbWIk3E7Xh6doWn7q1lzMotX1zXxsbY root@office-host-ubuntu The key's randomart image is: +---[RSA 2048]----+ | | | o . +.| | . . O = @| | + = @.O=| | S o * *o*| | o.. o.E+| | .o .++o| | o....+=o| | ..o .+o..| +----[SHA256]-----+ |