首先谈git仓库的问题:

    默认情况下,git基于标准SSH访问授权服务器时只能是每人一个账号,这样使得不好管理,而如果使用gitolite则使得所有用户公用一个git账户。具体区别如下:

gitolite-admin_第1张图片

gitolite-admin_第2张图片


所以我们的首要任务是在git服务器先安装gitolite,以实现对git仓库的账号控制:

(这里git服务器的管理者就是本机的root用户,且本机的IP地址为10.0.5.90。为了与后面的步骤混淆,我们可以定义此服务器为公司本地机房的git服务器)

# cd /root/.ssh && ssh-keygen -b 2048 -f admin
# vim config
    host gitolite-admin-server
        hostname        10.0.5.90
        identityfile    ~/.ssh/admin
# chmod 600 config
# cp /root/.ssh/admin.pub /home/git/ 
        (注意:这里与下面的步骤有点颠倒)

# useradd git
# sudo su - git
# git clone git://github.com/sitaramc/gitolite
# mkdir -p $HOME/bin
# gitolite/install -to $HOME/bin
# $HOME/bin/gitolite setup -pk /home/git/admin.pub
        (注意:这里如果使用变量不行,可以使用全路径)

# exit    
# cd /root/    
# git clone [email protected]:gitolite-admin
        (这里又返回root用户家目录,进行操作)
    到此为止,gitolite安装已经完成大半!
####################################################

如果此时需要给tom用户授权仓库名为car的读写权限,步骤如下:

拿到tom用户的公钥,然后命名为tom.pub,临时放到/tmp目录下了
# cd /root/gitolite-admin
# mv /tmp/tom.pub /root/gitolite-admin/key
# vim config/gitolite.conf
    repo gitolite-admin      这是管理员的仓库,可以添加、删除git用户
        RW+    =    admin    R表示只读,W表示写,+表示强制更新。
        
    repo car
        RW     =    tom      这里可以横向加上很多人,也可多次"RW = USER"
# git add .
# git commit -m "create repo car,and add user tom"
# git push origin master
        这里提交后会自动创建仓库car,所以不用再手动创建仓库。        
    到此为止,gitolite已经完全可用了
########################################################
排错:
#git push origin master
remote: WARNING: keydir/jinggao.pub duplicates keydir/ponyma.pub, sshd will ignore it
remote: FATAL: fingerprinting failed for 'keydir/cuowu.pub'

当出现FATAL时,就说明这个公钥内容有问题,可能不是openssl识别的格式。


使用tom用户测试gitolite是否可用:

# git clone [email protected]:car
         此时tom用户使用自己的private key就可以登录了。


上面的操作只是方便了在公司内部的程序猿可以方便的进行更新等。但是如果我们的公司在上海有分公司,而且程序猿之间依然需要使用同一个仓库,怎么办?

    gitolite mirror提供了我们可以异地同步指定git仓库的功能,具体实现原来可以参看下面的链接。gitolite mirror靠master主动推送git仓库到slave,所以需要在slave的gitolite-admin中加入master的公钥,而slave的公钥无需加入master。

    这里我们指定slave为线上服务器所在机房的一个gitolite。

    我们使用上面搭建出来的gitolite环境作为master,而slave的gitolite搭建参照master。而下面我们要做的事情也非常简单。

在master(10.0.5.90)上面:

# cd /root/gitolite-admin
# vim conf/gitolite.conf
   repo gitolite-admin
       RW+    =    admin    注意:这个master的管理仓库没有做mirror。
   
   repo car
       RW     =    tom      注意:在master上面并没有写上slave的名字。但有tom奥
       option mirror.master    =    zhu
       option mirror.slaves    =    cong
# git commit -am "update gitolite mirror master"
# git push origin master

# sudo su - git
# ssh-keygen -b 2048 
# scp /home/git/.ssh/id_rsa.pub [email protected]:/root/zhu.pub
        同样使用10.0.5.91的root作为slave的管理用户。
# vim /home/git/.gitolite.rc 
    HOSTNAME        =>  "zhu"    注意:此主机名任意写,与DNS及系统主机名无关
    'Mirroring'
    'mirror',
    这里只需要取消注释即可

# gitolite mirror push cong car
        格式:gitolite mirror push  
        由于主动推送可能会产生延迟,我们就手动即使推送。

在slave(10.0.5.91)上面的操作:

# cd /root/gitolite-admin
# vim conf/gitolite.conf
   repo gitolite-admin
       RW+    =    admin        注意:这个slave的管理仓库同样没有变化。
   
   repo car
       RW+    =    server-zhu   注意:这里必须使用"server-主名字"格式,无需tom
       R      =    10.0.6.153.capistrano   线上测试主机
       option mirror.master    =    zhu
       option mirror.slaves    =    cong
# cp /root/10.0.6.153.capistrano.pub key/
# git add .
# git commit -m "update gitolite mirror slave"
# git push origin master

# sudo su - git
# ssh-keygen -b 2048 
# scp /home/git/.ssh/id_rsa.pub [email protected]:/root/zhu.pub
        同样使用10.0.5.91的root作为slave的管理用户。
# vim /home/git/.gitolite.rc 
    HOSTNAME        =>  "cong"
    'Mirroring'
    'mirror',
    这里只需要取消注释即可
############################################
    当master进行推送时,slave上面便有了指定仓库的所有内容。

测试slave的可用性,在10.0.6.153上面使用capistrano账号:

# sudo su - capistrano
# ssh-keygen -b 2048
# scp /home/capistrano/.ssh/id_rsa.pub [email protected]:/root
# git [email protected]:car



当master向slave推送时,由于各种原因无法推送时,master端会产生一个错误日志,样式如下:

WARNING: previous mirror push to host 'cong' failed, status is:
Time	20222	ssh: cong: Name or service not known
Time	20222	fatal: Could not read from remote repository.
Time	20222	Please make sure you have the correct access rights
Time	20222	and the repository exists.


此警告信息文件在对应的repo仓库的根目录中,以"gl-slave"开头。如果确定已经能够正常推送,可以删除此文件。

当然如果repo太多,也不想手动的去删除,可以在/home/git/.gitolite.rc 文件的master 段加入如下参数:

HUSH_MIRROR_STATUS          =>  1,
HOSTNAME                    =>  "zhu",




以下链接为gitolite及gitolite-admin的详解链接:

http://www.ossxp.com/doc/git/gitolite.html

https://github.com/sitaramc/gitolite

http://gitolite.com/gitolite/mirroring.html