使用gitolite搭建完美Git服务器以及Git钩子的使用
上节讲到如何使用在阿里云上申请一个9.9的服务器初始化配置,那么现在需要在这个服务器上搭建git服务器,下面来说一下我这一周多求学的知识。
一、使用gitolite搭建git服务器
1.首先使用ssh 用户名@ip地址 远程连接到你的服务器;
2.然后输入用户的密码去登录;
3.现在进去正题,使用yum update
更新所需要的数据包,系统会先提示你需要更新那些包,输入y去执行更新;


以上是一个更新完整的过程。
4.安装git
yum install git
安装的顺序大概和上面的一样,先会告诉你有哪些需要更新,然后输入y,执行更新。安装成功之后可以输入 git 查看其相关的命令。
5.安装perl
yum install perl
注意:在安装perl的同时,最好把 cpan 也同时安装一下
yum install cpan
6.安装openssh
yum install openssh
以上这些都是开发前的环境准备,现在开始进入正题;
7.添加git、gitadmin用户
useradd git
//添加一个用户名为 git 的用户,这个名字你可以随便起
//比如,我想添加一个madman用户,使用useradd madman
//以上解释是害怕你们被误导,但是建议用户名还是起的有意义比较好
8.相关命令
- 添加用户的ssh登录密码
passwd git //为git用户添加登录的密码
- 查看所有的用户
cat /etc/passwd //这个命令用来查看所有的用户

这里有人会问,为什么会有这么多用户呢?大多都是系统自带的,而只有像root、git这样的以/bin/bash的,是可以使用ssh登录的。

- 查看所有用户的详细信息
cat /etc/shadow

别问我用户:后面那一长串东东是什么鬼,我只能说我也不是很清楚,应该有端口号,有用户的id什么的吧,具体你们用到的时候可以上网搜一下,那么第一个是用户的密码,当然是经过加密处理的。
还有的是
ntp:!!:17357
是什么鬼?这是说明这个用户是被锁定的,其实一开始添加 git 用户的时候,如果不给 git 用户添加密码,它的状态也是被锁定的。比如我现在添加一个 gitadmin 用户来查看一下:
- 删除用户
userdel -r gitadmin //删除gitadmin用户以及关联文件
9.在 gitadmin 用户下生成公钥私钥
ssh-keygen //中间敲三次回车
//第一次:默认生成的路径,回车
//第二次第三次 输入密码 确认密码,建议回车

10.把私钥移动到tmp目录下
cp id_rsa.pub /tmp/gitadmin.pub
//ps:截图中敲错单词了,不要在意这些细节,最后我又改回来了

11.在 git 用户下安装 gitolite
首先,来到 git 用户的home目录下,依次执行
git clone https://github.com/sitaramc/gitolite
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin


12.设置管理员的私钥
在git用户下的/bin目录下,执行
./gitolite setup -pk /tmp/gitadmin.pub

在git用户下会多出两个文件projects.list 、respositories:

respositories文件是所有的仓库,这里在git用户下只是做配置;
cd 到respositories目录下,我们查看一下目录下的东西:

13.切换到gitadmin用户下,clone git用户下的gitolote-admin.git
git clone git@ip地址:gitolite-admin

我们看到gitadmin用户下已经存在了这个目录,然后查看一下这个目录,下面有两个文件,这两个文件一会儿再去操作:

14.现在我们要在本地生成公钥私钥,然后copy到gitadmin/gitolite-admin/keydir下,至于如何在本地生成公钥私钥,我之前有篇文章提到过,可以去那里看一下,http://www.jianshu.com/p/32690ccd101b,下面只执行scp操作去操作本地的公钥;
scp id_rsa.pub root@ip地址:/home/gitadmin/gitolite-admin/keydir/liding_mac.pub

来到服务器gitadmin用户下,查看上传的文件:

但是,我们还需要做git的一系列操作,我们先查看一下现在是什么状态:

我们按照提示去git add 到暂存区,再去查看状态:

根据上面的提示,我们再去执行commit操作:

好吧,再根据提示告诉git你是谁,再去执行commit操作:

最后,我们终于可以执行git push操作了:

好了,最后可以看到缓存区已经被清空了,那么通过以上操作,大概可以明白gitadmin/gitolite-admin/keydir这个文件是用来放置公钥的;
15.下面来说一下conf这个文件,我们先打开看一下这个是干什么的。

可以看到里面有一个文件gitolite.conf文件,打开这个文件是上图的代码;那么这个文件是干什么的?其实这个就是所谓的仓库,这里面每一个repo都是一个仓库,一般一个项目可以关联一个仓库,我们可以使用vim打开新增或删除这个仓库,再和上面同样的操作就可以了,最后使用```git clone git@ip地址:仓库名``把空仓库pull下来,可以往里面添加东西。
好了,以上就是整个git服务器的搭建过程,接下来就是git中钩子的使用了。
至于什么是钩子,这里就不再做详细解释,从以上的搭建中,只要把用户的本地公钥添加到gitadmin下的keydir文件中,就可以把项目pull下来直接使用,也可以进行git的相关操作,而最终完整的项目存在于git用户下的repositories目录中。但是我们不可能把这个项目直接copy下来放到服务器的一个目录下,然后域名指向这个目录中的索引文件。当然你这样开发完成之后再去这样操作也是可行的,但是维护呢?总不能维护的时候再去copy一份吧,这显然也不是一个很好的开发体验。那么这里就需要用到git钩子了,我们每次做git操作的时候都会触发这个钩子执行一系列的操作,去更新服务器中的文件,想想就比较完美。那么,接下来我会一步一步操作去演示。
二、使用git钩子完善完美的git服务器
1.首先,我们切换到gitadmin 用户,来到gitolite-admin/conf/目录下,在gitolite.conf中添加一个新的仓库,比如下图中的ipaiban-admin:

然后执行git status,根据相关提示进行一系列的git操作,以上都有,这里不再重复了。
那么,现在我们就可以从本地正常git clone下来这个仓库了,但是这是一个空仓库,先不要管他。
2.切换到git用户下,可以看到在repositories中已经有了ipaiban-admin.git目录

我们查看一下ipaiban-admin.git目录里都有什么:

别的目录都不要管,可以看到有个hooks目录,继续查看

好了,这里就是我们要找的目录了,我们需要在这个目录下创建钩子文件:
使用vi 创建一个新文件
vi post-receive
在这个文件中写shell脚本并保存:
#!/bin/sh
unset GIT_DIR
MYDIR=ipaiban-admin
cd mnt/work/$MYDIR
git pull
git checkout dev
sudo cp -rfu ./* /mnt/w3c/$MYDIR
cd /mnt/w3c/
sudo chown -R www.www $MYDIR
3.来到挂载的硬盘mnt下,创建两个目录:work 以及 w3c
mkdir work
mkdir w3c
sudo chown -R www.www w3c
sudo chown -R git.git work
然后分别在w3c下和work下创建ipaiban-admin目录;
需要注意的是work一定要分给git 用户,并且需要生成git用户的公钥,并放到gitadmin下的keydir文件里面并执行git一系列提交操作;

结束语:(重要)
OK,到这里基本已经结束了,最后要做的是把域名指向w3c下的ipaiban-admin就可以了,这里只适合测试服务器,而正式服务器的操作最好不要用钩子直接关联,而是把正式服务器生成密钥加到测试服务器的keydir文件里,需要更新到正式服务器的时候,手动执行一下上面的脚本,有人会发现,我在shell脚本里都切换到了dev分支,为什么呢?因为一般master分支是用来搭建主体架构的,不建议直接进行开发,需要建一个分支去开发,这里我建立了一个dev分支,而实际开发中还需要real分支,就是正式分支,在dev分支上开发测试完成之后,合并到real分支去。
Happy Hacking~