Rover12421's Blog

The End.

Gitolite v3.x 镜像服务器配置

        最近一次在VMware上,挂载未成功处理的快照,导致快照丢失,数据也丢失了,想想那个git只放本地的打算也可能是个噩梦,还是赶紧搭建好镜像服务器较为保险.

        在这不得不说下<Git权威指南>更新还是太慢,gitolite章节完全跟不上gitolite的更新速度.而网上查找gitolite v3.x的资料也很少,只好看gitolite自己的文档了.自家文档就是全面,但是看的头痛啊.

        
         gitolite镜像文档:http://sitaramc.github.com/gitolite/mirroring.html
        
         整理下我搭建的过程吧,我就不按文档的步骤走了,因为这样才好说明因果关系.
         1.搭建主从gitolite环境
         我使用的都是git.用户名其实是可以不同,后面会说到.
         安装gitolite就不说了,不会的可以参考:http://www.rover12421.com/2013/02/01/centos-install-gitolite.html

         由于是多机器多帐号操作,执行环境总是变化的,所以需要几个标志作为前缀加以区分.

         >gitlocal$:表示在本机(127.0.0.1)git帐号登录,pwd是~.也是主服务器.
         >gitmirror$:表示是镜像服务器(gitmirror.rover12421.com)上git帐号登录,pwd也是~.也就是mirror镜像(从)服务器.
         >adminLocal$:表示本地帐户(rover12421)登录,拥有主服务器上gitolite-admin同步管理权限,pwd是 `git clone git@127.0.0.1:gitolite-admin`同步后的gitolite-admin目录
         >adminMirror$:表示本地帐户(rover12421)登录,拥有镜像服务器上gitolite-admin同步管理权限,pwd是 `git clone git@gitmirror.rover12421.com:gitolite-admin`同步后的gitolite-admin目录

         2.给主从gitolite设置名称

>gitlocal$:vi .gitolite.rc
HOSTNAME                    =>  ‘gitlocal’,

 >gitmirror$:vi .gitolite.rc
HOSTNAME                    =>  ‘gitmirror’,

           3.添加镜像配置

>adminLocal$:vi conf/gitolite.conf

给testing库配置镜像服务器

repo testing
     RW+     =   @all 
     option mirror.master        = gitlocal
     option mirror.slaves        = gitmirror
     option mirror.redirectOK    = all

当然也可以一次性把所以库都配置好,但是这样有风险,一旦gitolite-admin配置出现啥问题,就难以修复了.不推荐这样做

repo @all
   option mirror.master        = gitlocal
   option mirror.slaves        = gitmirror
   option mirror.redirectOK    = all

>adminLocal$:git commit -a -m “给testing添加镜像配置”
>adminLocal$:git push

        后面还有很多类似上面两句git操作,我就不详细写了,简写 `git commit & git push`.
        4.配置HOSTNAME
      最开始,我把镜像的名称写成了gitmirror.rover12421.com,居然可以直接手动提交(当然权限是通过的).后来我就想,他怎么知道我的别名对应的域名或ip是啥啊,如果我改成其他难道也能找到,这么神奇.后来仔细看文档,原来我还很多没配置呢(自己不仔细看文档,还怪人家没说明白::!)
        1.2.1 第2点就写了

Give the server a short, simple, “hostname” and set the HOSTNAME in the rc file to this name

      当时我也疑惑,这个HOSTNAME要写到哪,咋写啊,继续往下看:

Create “host” aliases to refer to all other machines. See here for what/how.

      原来还有个链接,那就按链接里的说明来写吧.

>gitlocal$:vi ~/.ssh/config
host gitmirror
     user            git
     hostname        git.rover12421.com
    port            22
    identityfile    ~/.ssh/id_rsa

        看到这就明白了.而且还明白一点,原来用户名可以不相同,原来端口也是可以在这里配置的@:)
        5.配置key文件

Copy all keys to all the admin repo clones on your workstation and and add them as usual. This is an  O(N2) operation ;-)

       需要把所以key放到 gitolite-admin 的 clone 目录下,并同步上去.而且操作效率是O(N^2),还真不是吹的啊,还好我之有2个gitolite服务器.
         这里还的来个假设,生成key和上传下载到指定位置真不想说了....
          假设我们已经把gitlocal的key放在本地"/gitlocal.pub",gitmirror的key放在本地"/gitmirror.pub"下了

>adminLocal$:cp /gitlocal.pub /gitmirror.pub keydir/
>adminLocal$:git commit & git push

>adminMirror$:cp /gitlocal.pub /gitmirror.pub keydir/
>adminMirror$:git commit & git push

           其实这样是不对,但是到目前为止,我们已经可以手动把本地库提交到镜像库了,什么,不是说不对么.

>gitlocal$:gitolite mirror push gitmirror testing

           试试上面这句手动提交,看看是不是真的可以(当然是可以的啦...)
           既然不对,那么正确的应该怎么样呢,看文档:

You may have guessed that the prefix ‘server-’ is special, and distinguishes a human user from a mirroring peer.

          哦,原来要给主gitolite的key加上'server-'的前缀.好,那么我们修改下:
>adminLocal$:git mv keydir/gitlocal.pub keydir/server-gitlocal.pub
>adminLocal$:git commit & git push

>adminMirror$:git mv keydir/gitlocal.pub keydir/server-gitlocal.pub
>adminMirror$:git commit & git push

           最后文档也交我们怎么测试,是否正确配置了:

>gitlocal$:ssh gitmirror info

          只要执行改命令后,显示的是以"hello server-"开头的就正常了(文档和我的有点出入,我的版本是gitolite3 v3.3-7-g3e87a08,文档里写的是"hello, server-", 多了个符号::@)
          我这里现在显示的是:

hello server-gitlocal, this is git@localhost running gitolite3 v3.3-7-g3e87a08 on git 1.7.1

          6.启用镜像
          啥,到现在还没启用镜像配置?对头.如果你喜欢用手动提交,就是另外一回事了@.@

When that is all done and tested, enable mirroring by going through the rc file and uncommenting all the lines mentioning  Mirroring.

>gitlocal$:vi .gitolite.rc

           搜索"Mirroring"开头的配置,去掉前面的"#"即可,一共有3处.下面是简写的:

INPUT=>[‘Mirroring::input’,]
PRE_GIT=>[‘Mirroring::pre_git’,]
POST_GIT=>[‘Mirroring::post_git’,]

          到这里已经配置好了,可以提交测试了.最后说下我配置的时候遇到的2个错误:
          第一个错误:
ssh local info
Bad owner or permissions on ~/.ssh/config

         这个是权限引起的,同样的权限(664),在Ubuntu下是没问题的,在CentOs下就会出问题,CentOs下需要修改权限

chmod 644 ~/.ssh/config

         第二个错误:

git push
FATAL: gitlocal: ‘testing’ is mirrored but not here
fatal: The remote end hung up unexpectedly

        这个错误真不应该出现,错误原因是我把 ~/.gitolite.rc 的HOSTNAME属性拼写成 gitloacl ,前后不对应导致的...
==================================================================================================================
20130816:
danganxi 给我邮件说他的v3.5.1-2-g962e465配置和我的不一样了.下面是他的解决步骤:
版本v3.5.1-2-g962e465下,需要修改rc文件三处配置:

1、  # the Mirroring feature needs this
        HOSTNAME                  =>  "gitmirror",    //镜像服务器的别名
 2、    # Uncomment or add new commands here.
            # 'create',
            # 'fork',
             'mirror',                   //打开此处
            # 'sskm',
            # 'D',
3、    # system admin stuff
            # enable mirroring (don't forget to set the HOSTNAME too!)
             'Mirroring',   //打开此处
            # allow people to submit pub files with more than one key in them
            # 'ssh-authkeys-split',

Comments