Git服务器搭建与客户端简单操作

服务器端准备工作:

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/gitgit 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]-----+