阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

基于Gitolite的Git服务架设

128次阅读
没有评论

共计 4781 个字符,预计需要花费 12 分钟才能阅读完成。

如果不是要与他人协同开发,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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计4781字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中