首先谈git仓库的问题:
默认情况下,git基于标准SSH访问授权服务器时只能是每人一个账号,这样使得不好管理,而如果使用gitolite则使得所有用户公用一个git账户。具体区别如下:
所以我们的首要任务是在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