系统:Centos 6.4 64bit

首先安装git

# yum -y install git-all

1、新建用户www用于运行web服务,同时由此用户同步文件到网站的目录

2、新建用户git-admin用于管理git的用户(删除、添加)和库(删除、添加、权限管理)

# user add www ; user add git-admin

# echo www|passwd --stdin www ; echo git-admin|passwd --stdin git-admin

3、切换到git-admin并产生密钥对,此密钥对用于git-admin获取shell进行管理

# su - git-admin

# ssh-keygen -f ~/.ssh/admin_shell -P ‘’

4、将公钥添加到www用户的~/.ssh/authorized_keys文件中以实现管理员可以获取shell

# ssh-copy-id -i ~/.ssh/admin_shell.pub www@10.10.11.240

5、再产生另一个密钥对用于git-admin管理用户和库,但不能获取shell,此密钥这里不指定名称,使用默认名称id_rsa

# ssh-keygen -P ‘’

6、将此公钥~/.ssh/id_rsa.pub复制到/tmp/admin.pub以便www用户使用

# cp ~/.ssh/id_rsa.pub /tmp/admin.pub

到目前git-admin已经有两个密钥对了,为了实现git-admin使用不同的服务,而使用相应的密钥,那么这里需要添加个配置文件~/.ssh/config

# cat ~/.ssh/config (此配置文件只是针对管理员,因为普通用户一般不允许获得shell的)
host shell #使用此主机名,将可以获得shell
user www
hostname 10.10.11.240
port 22
identityfile ~/.ssh/admin_shell

host repo #使用此主机名,将不能获得shell
user www
hostname 10.10.11.240
port 22
identityfile ~/.ssh/id_rsa

通过上面的配置git-admin用户可以使用下面命令登录www

# ssh shell
$ exit

安装gitolite

1、现在切换到www用户安装gitolite

#su - www
$ git clone git://github.com/sitaramc/gitolite
$ mkdir ~/bin
$ gitolite/install -ln
使用管理员的公钥初始化库
$ bin/gitolite setup -pk /tmp/admin.pub

到此gitolitegit安装完成,接下来是用户和库的管理了,需要注意:所有的用户和库的添加和删除都不能在服务器端进行,这些操作都要在客户端进行,当然,说明下,这里我服务端和客户端都在同一机器了,这里git-admin就相当于客户端。好,现在切换到git-admin用户进行管理

1、切换到git-admin,并把服务端的gitolite-admin库克隆下来

# su - git-admin
$ git clone www@10.10.11.240:gitolite-admin.git
或者 $git clone repo:gitolite-admin.git (如果前面的密钥配置正确了,这里是不需要输入密码的)

用户管理

说明:gitolite添加用户不是在服务端直接useradd来添加的,而是通过管理员(:git-admin)利用各种方式收集用户的公钥 ,并进行规范命名后保存在gitolite-admin/keydir/ 目录下,然后管理员进行git add ,git commit,最后最重要的一步git push,这样才算真正添加完成用户。下面添加一个用户logan

1、利用各种方式获得logan的公钥,并将其置于gitolite-admin/keydir/目录下

2、进行添加用户操作

$ git add gitolite-admin/keydir/logan.pub
$ git commit -a -m Add an user named logan”’
$ git push repo:gitolite-admin.git

如果要删除logan用户,则也是通过git-admin删除gitolite-admin/keydir/logan.pub,然后再进行提交更新,操作如下

$ git rm gitolite-admin/keydir/logan.pub
$ git commit -a -m Remove user logan
$ git push repo:gitolie-admin.gi

库管理

说明:管理库也不能在server端直接操作(当删除一个库时,需要登录server端删除相应库的目录,后面有演示),库的添加、删除方法也类似于用户,库的管理通过修改gitolite-admin/conf/gitolite.conf 进行管理 ,下面添加两个库blogwww

$ cat conf/gitolite.conf

repo gitolite-admin
RW+ = admin

repo testing
RW+ = @all

repo blog
RW+ = admin
RW = @all

repo www
RW+ = admin
RW = @all

$ git add conf/gitolite.conf
$ git commit -a -m 'Add two repositories -- blog & www'
$ git push repo:gitolite-admin.git

自动部署

有这样的需求,www这个项目,要求用户每次push后,www自动部署到/data/www目录,这个目录是web代码存放的目录,这里可以利用/home/www/repositories/www.git/hook目录下的post-receive脚本实现,脚本内容如下

$ cat /home/www/repositories/www.git/hooks/post-receive
#!/bin/bash
unset GIT_DIR
GIT_WORK_TREE=/home/www/codes/www
DEPLOY_DIR=/data/www
cd $DEPLOY_DIR
git pull /home/www/repositories/www.git
DATE=`date +"%F %T"`
if [ $? -eq 0 ];then
echo "$DATE: The www deployment was successful!" >> /var/log/git.log
else
echo "$DATE: The www deployment was unsuccessful!" >> /var/log/git_err.log
fi

这样,当用户push后,www的代码就会自动部署到/data/www目录下了

好了,目前只有git-admin一个管理员,现在要把logan提升为管理员

1、切换到git-admin,编辑/home/git-admin/gitolite-admin/conf/gitolite.conf, 对应修改下面行

# cat /home/git-admin/gitolite-admin/conf/gitolite.conf

@admin = admin logan
repo gitolite-admin
RW+ = @admin

# git add /home/git-admin/gitolite-admin/conf/gitolite.conf
# git commit -a -m Promoted logan to the administrator
# git push repo:gitolite-admin