zoukankan      html  css  js  c++  java
  • 基于Gitolite的Git服务架设

    如果不是要与他人协同开发,git根本不需要架设服务器,git可以直接使用本地版本库的路径完成git版本间的操作。但是如果需要和他人分享版本库,协作开发,就需要能够通过网络协议操作git库。git支持的协议很丰富,架设服务器的选择也很多,不同的方案有着各自的公优缺点。本文就以gitolite为例构建一个高效的多人协作的git服务器。

    环境:

    git客户端test.cmmobi.com(172.16.5.202),git服务器为git.cmmobi.com(172.16.5.200)。配置好/etc/hosts文件,以让其可互相解析

    cat /etc/hosts

    172.16.5.202 test.cmmobi.com
    172.16.5.200 git.cmmobi.com


    客户端配置(test.cmmobi.com上的配置)
    创建用户,并生成密钥对,在此为方便测试,就不再另外创建用户,直接使用root用户即可。
    cd /root
    mkdir .ssh
    ssh-keygen -f ~/.ssh/admin
    将生成的公钥上传到git服务器的/tmp目录以备用
    scp ~/.ssh/admin.pub root@git.cmmobi.com:/tmp
    创建访问git服务时的配置文件
    cat ~/.ssh/config
    host gitolite #git服务器别名
    user git #服务端管理gitolite的用户
    hostname git.cmmobi.com #git服务器的主机名
    port 22 #访问git服务器时的端口号
    identityfile ~/.ssh/admin #访问git服务器时使用的公钥文件
    chmod 600 ~/.ssh/config


    服务端配置(git.cmmobi.com上的配置)
    服务要求:
    1.任意的unix系统
    2.shell环境
    3.git版本为1.6.6及以上
    4.perl版本为5.8.8及以上
    5.openssh版本为5.0及以上
    安装:
    1.使用root用户登陆服务器,并创建git用户,用以管理git服务
    useradd git
    echo "git" | passwd git --stdin
    2.切换到git用户,并确保~/.ssh/authorized_keys文件为空或者不存在
    3.执行安装操作:
    git clone git://github.com/sitaramc/gitolite #下载gitolite软件
    mkdir -p $HOME/bin
    gitolite/install -to $HOME/bin #安装gitolite
    export PATH=$PATH:$HOME/bin
    echo "PATH=$PATH:$HOME/bin" >> .bashrc
    gitolite setup -pk /tmp/admin.pub #将客户端的root用户配置为git的管理员
    如果在执行gitolite/install -to $HOME/bin时报如下错误:
    Can't locate Time/HiRes.pm in @INC (@INC contains: /home/git/gitolite/src/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/git/gitolite/src/lib/Gitolite/Common.pm line 74.
    BEGIN failed--compilation aborted at /home/git/gitolite/src/lib/Gitolite/Common.pm line 74.
    Compilation failed in require at ./install line 15.
    BEGIN failed--compilation aborted at ./install line 15.
    需要安装perl-Time_HiRes:
    yum install -y perl-Time-HiRes


    安装完成后,我们可以在$HOME下看到一个repositories目录,里面有两个仓库,分别为gitolite-admin和testing,其中gitolite-admin为管理仓库。
    在客户端通过root用户克隆gitolite-admin库
    git clone gitolite:gitolite-admin
    进入gitolite-admin仓库,会看到两个目录,分别为keydir和conf,其中keydir目录用来管理用户,在其中可以看到默认有一个文件叫做admin.pub,正是我们之前生成的管理用户的公钥文件。下面我们再添加一个用户breezey:
    useradd breezey
    echo "breezey" | passwd breezey --stdin
    su - breezey
    mkdir .ssh
    ssh-keygen -f .ssh/breezey
    vim .ssh/config
    host gitolite
    user git
    hostname git.cmmobi.com
    port 22
    identityfile ~/.ssh/breezey
    su - root #切换回管理用户
    cp /home/breezey/.ssh/breezey.pub /root/gitolite-amdin/keydir
    cd /root/gitolite-admin
    git add keydir
    git status
    git config --global user.email "breezey@cmmobi.com"
    git config --global user.name "breezey"
    git commit -a "add user:breezey"
    git push
    su - breezey #再切换到breezey用户
    git clone gitolite:testing #克隆testing仓库,这时已经可以成功克隆。
    我们可以进入到testing库中,创建一个测试文件并提交:
    cd testing
    echo "Hello World" > welcome.txt
    git add *
    git commit -m "a new file:welcome.txt"
    git push
    当我们第一次提交并执行git push时,会出现如下错误:
    No refs in common and none specified; doing nothing.
    Perhaps you should specify a branch such as 'master'.
    fatal: The remote end hung up unexpectedly
    error: failed to push some refs to 'gitolite:test1'
    出现这个问题的原因,是因为git找不到你要提交的版本,可以使用如下命令:
    git push origin master


    Gitolite授权详解
    前文我们提到,在gitolite-admin的管理仓库中有两个目录,其中keydir目录为管理用户的目录,而另外一个conf目录里,有一个叫作gitolite.conf的配置文件,此文件即是管理仓库及用户授权的文件。
    我们先来看一个该配置文件的示例:
    1 @admin = breezey chenliang
    2 repo gitolite-admin
    3 RW+ = breezey
    4 repo ossxp/.+
    5 C = @admin
    6 RW = @all
    7 repo testing
    8 RW+ = @admin
    9 RW master = junio
    10 RW+ pu = junio
    11 RW cogito$ = pasky
    12 RW bw/ = linus
    13 - = somebody
    14 RW tmp/ = @all
    15 RW refs/tags/v[0-9] = junio
    我们先对该示例文件作一个简单的说明,以方便大家对授权文件有一个基本的了解:
    第1行定义了一个admin的组,该组里包含两个用户,分别是breezey chenliang
    第2-3行定义了一个版本库gitolite-admin,并且指定breezey用户对gitolite-admin仓库拥有读(R),写(W)和强制更新(+)的权限
    第4行通过正则表达式定义了一组版本库,即ossxp目录下的所有版本库
    第5行定义admin组的用户可以在ossxp目录下创建版本库
    第6行定义所有用户对ossxp目录下的版本库拥有读写的权限,但不能强制更新
    第7行定义了一个版本库testing
    第8行定义了admin组用户对testing库的所有分支和tag拥有读、写、重置、添加、删除的权限
    第9行定义junio用户对master分支有读写的权限,还包括以master开头的所有分支。
    第10行定义junio用户对pu分支拥有读写,重置,添加,删除的权限,还包括以pu开头的所有分支
    第11行定义pasky用户对cogito分支拥有读写的权限,仅此分支,精确匹配
    第12行定义linus用户对bw/拥有读写的权限
    第13行定义somebody用户对testing仓库有写的权限
    第14行定义所有用户对tmp/拥有读写的权限
    第15行定义junio可以读写任意tag,包括以v加上数字开头的tag


    组的定义:
    @admin = breezey chenliang
    @user = @admin @staff user1
    版本库的定义:
    repo ossxp/.+ #匹配ossxp目录下的所有版本库
    repo myrepo.$ #匹配以myrepo.结尾的版本库
    repo sandbox/test1 #创建sandbox下的test1库
    授权关键字:
    C:
    C代表创建。仅在符版本库授权时可以使用。用于指定谁可以创建与通配符匹配的版本库。
    R,RW,RW+:
    R为只读,RW为读写,RW+为读写及强制push
    RWD,RW+D:
    只有当授权指令中定义了正则引用(正则表达式定义的branch、tag等),才可以使用该授权指令。其中 D 的含义是允许删除和正则引用匹配的引用(branch or tag)
    RWCD,RW+CD:
    只有当授权指令中定义了正则引用(正则表达式定义的branch、tag等),才可以使用该授权指令。其中 C 的含义是允许创建和正则引用匹配的引用(branch or tag),D的含义是允许删除和正则引用匹配的引用(branch or tag )
    -:
    减号(-)是一条禁用指令,只对写操作起作用,不会对用户的读操作施加影响。

    Git 的详细介绍:请点这里
    Git 的下载地址:请点这里

    推荐阅读:

    Fedora通过Http Proxy下载Git http://www.linuxidc.com/Linux/2009-12/23170.htm

    在Ubuntu Server上安装Git http://www.linuxidc.com/Linux/2009-06/20421.htm

    服务器端Git仓库的创建(Ubuntu) http://www.linuxidc.com/Linux/2011-02/32542.htm

    Linux下Git简单使用教程(以Android为例) http://www.linuxidc.com/Linux/2010-11/29883.htm

    Git权威指南 PDF高清中文版 http://www.linuxidc.com/Linux/2013-10/91053.htm

    本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2014-02/96991.htm

  • 相关阅读:
    MySql msi安装
    C# TextBox文本内容选中
    SQL 删除时间最靠前的几条数据
    Layui表格工具栏绑定事件失效问题
    Layui我提交表单时,table.reload(),表格会请求2次,是为什么?按下面的做
    table 中数据行循环滚动
    html 3D反转效果
    网页电子表数字样式
    power tool 强制撤销
    GHOST -ntexact 正常还原
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8300966.html
Copyright © 2011-2022 走看看