操作系统

当前位置:金沙棋牌 > 操作系统 > 上搭建git服务器和配置gitolite权限管理,git服务器

上搭建git服务器和配置gitolite权限管理,git服务器

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-07 17:21

系统:centos7

本文讲解在ubuntu上安装gitolite,为客户端提供git仓库服务器功能。ubuntu版本:server 16.04
by kowen

git简介

什么是git服务器?我觉得其实就是集中存放git仓库的服务器,只不过这些git仓库要对外开放,让其他人来连接和push代码。

服务器:阿里云

安装准备

  1. 安装gitolite前,要安装 git,openssh-server和 openssh-client
    sudo apt-get update
    sudo apt-get -y install git openssh-server openssh-client

  2. 准备好你的ssh私钥和公钥
    没有的话可在本地执行ssh-keygen -t rsa -C "yourname@example.com 生成一个,生成后在~/.ssh/目录里,id_rsa是私钥,id_rsa.pub是公钥,文件生成后可以改名。

  3. 上传公钥
    将公钥上传到服务器备用,比如是/tmp/YourName.pub

  首先,与以前广为流行的SVN不同,git是分布式的,其没有服务器端与客户端之分(虽然在项目管理过程中,一般会人为地指定某一台非开发用的机器作为“服务器”,但就git自身功能来说,完全可以没有这个台“服务器”,至于实际中为什么会有,后面将会讲到)。

当前服务器上集中管理的git仓库不是使用git init来创建的,而是使用git --bare init来创建的空白仓库,创建很简单,关键是如何管理和配置这些访问仓库的用户和访问的全县什么的。 其实我发现只要配置上gitolite,就可以相当于配置了一个git服务器

一、前期准备

添加git用户

sudo adduser --system --shell /bin/sh --group --disabled-password --home /home/git git

  • 使用命令添加加上--system参数,用户就不会在登陆界面显示
  • home是git用户主目录,也是git仓库的存储目录,如果仓库比较大可以放在别的盘中,比如我的就是/data/git

 

      

1.安装git

安装gitolite

  1. 登录到git用户
    sudo su - git
  2. 确保 ~/.ssh/authorized_keys 文件不存在或者为空
  3. 把公钥拷贝到git主目录下
    cp /tmp/YourName.pub $/Home/YourName.pub
  4. 下载并安装gitolite
git clone https://github.com/sitaramc/gitolite
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin
  1. 初始化gitolite, 同时配置管理员
    gitolite setup -pk YourName.pub
    如果以上命令提示找不到,执行下面的代替
    $HOME/bin/gitolite setup -pk YourName.pub

然后,git的分支(branch)与合并(merge)功能非常强大与智能。据维基百科所说:git最为出色的就是它的合并跟踪(merge tracing)能力。作为SVN与git的用户,亲身体验告诉我,git提供的分支间代码合并功能的确非常强大,很少出现需要手动合并代码的情况,即使出现,其提供的冲突提示与解决方案也非常方便跟简单。

   前置配置

       一、检测并安装git

       git的安装,可以百度一下很简单在,这里就不多说了

       git安装好之后,在第三步你想要管理的账号上执行下边命令,主要是这设置一下用户信息,方便git commit时git附带打上这些信息,以供记录

git config --global user.name "yourname"  
git config --global user.email "your@email.com"

       二、创建一个git用户,这个git用户算是一个其他用户访问git的一个入口

       #git用户并使用/bin/bash作为登陆shell.

       #在这里说一下有些教程可能会说设置git用户的shell为/usr/bin/git-shell为git用户的登陆shell.

       #在我试验下,使用git-shell可以作为简单的使用,即创建一个仓库,让其他人连接上,这是可以的。但是设置这个是无法使用gitolite,应为这个shell不支持普通的命令   

useradd -m git -s /bin/bash
#设置密码 
passwd git

       三、创建你想要管理git仓库的用户的sshkey.我这里是root用户。

       假如这个用户根目录下已经村子.ssh文件和id_rsa和id_rsa.pub则可以忽略这一个步骤

       创建秘钥很简单,执行ssh-keygen命令,然后一直空格即可(前提是你当前登录用户要是root)。当然这个是创建简单的秘钥,你如果要安全性高的,可以去百度一下如何使用ssh-keygen.

ssh-keygen
yum install git

克隆管理库到本地

不要直接在服务器上创建和管理仓库,仓库管理是通过叫gitolite-admin的仓库进行的,这个仓库在初始化gitolite时就已经生成了,管理员可以克隆到本地进行配置,在客户端执行

git clone git@服务器地址/gitolite-admin.git

如果提示输入密码,编辑客户端的~/.ssh/config文件,添加以下内容:

Host 服务器地址
    HostName 服务器地址
    User git
    Port 22
    IdentityFile /home/用户名/.ssh/私钥文件名

 

金沙棋牌,   安装和配置gitolite

       此处提前注意一下,加入你用root用户在git用户的根目录下创建了一些文件,请务必将这些文件的所有者设置为git即执行chown -R git:git filePath  #-R命令是指同时将文件目录下的文件也设置所有者为git

       如果忽略这一点,就会出现你及时配置好,但是使用的时候报错误,简单的错误提示权限不够,复杂的可能你要百度查一下才知道是这个问题,

       笔者就是没人提醒,按照网上的教程写着执行chown,但是不明白为什么,生搬硬套老是出错。

       登陆git用户(su git或者ssh连接git用户)

      1、git clone git://github.com/sitaramc/gitolite # 获取gitolite的源码  
      2、mkdir -p $HOME/bin  #为gitolite的二进制文件生成创建目录  
      3、gitolite/install -to $HOME/bin  # 编译生成安装文件 

       4、安装和初始化gitolite,

       这一步有两点需要注意,

       第一点:必须用git用户来执行,不要想着使用sudo,因为gitolite会在执行命令的根目录建立一个repositories文件夹,加入你使用sudo的话,实际是将这个文件夹创建到了root用户上

       第二点:gitolite初始化时需要设置一个用来管理gitolite的用户,实际就是指定这个用户的公钥,这个再初始化之后,你就可以使用root用户来管理gitolite. 这一项之后你可以再更改的。

       将管理用户的公钥(.ssh/id_rsa.pub文件)复制到/temp下,并改为admin.pub
       $HOME/bin/gitolite setup -pk /tmp/admin.pub # 安装并初始化,指定admin.pub公钥文件对应的用户为超级管理员  

       到此gitolite就已经配置和安装好了,之后就是如何使用gitolite来管理仓库了。

 

添加用户和仓库

gitolite-admin里面两个文件夹keydir和conf:

  1. keydir存储用户的公钥,添加用户可以直接拷贝用户的公钥到此文件夹;
  2. conf目录里的gitolite.conf是配置文件,格式如下:
repogitolite-admin
    RW+     =   id_rsa
repo    testing
        RW+     =   @all

比如要添加一个仓库‘foo',并给alice,bob和carol不同的权限,首先把他们的公钥(alice.pub,bob.pub,carol.pub)拷贝到keydir;然后编辑conf/gitolite.conf添加:

repo foo
    RW+         =   alice
    RW          =   bob
    R           =   carol

最后把修改push到服务器:

git add conf
git add keydir
git commit -m "added foo, gave access to alice, bob, carol"
git push

服务器会自动添加用户到~/.ssh/authorized_keys,并且添加一个新的空仓库'foo'。

上述操作完成后,alice、bob和carol就可以将仓库克隆到本地:
git clone git@服务器地址:foo

查看对仓库的操作权限,可以在客户端执行
ssh git@服务器地址 info

最后,它是开源的,它正在变得越来越强大跟方便,同时,好用配套工具也越来越多,使得git的使用与管理更简单方便。

   使用gitolite管理权限和管理git仓库

       你要用它来进行管理,那还需要一定的操作。这里说一下,gitolite安装后本身是一个特殊的git版本库——gitolite-admin,分布式的进行修改,然后通过push的方式提交,其会通过钩子脚本执行权限更新。在上述步骤的最后一步执行完后会在git用户的根目录下创建一个repositories文件夹(这个文件夹就是以后存放git仓库的地方)并且gitolite自动生成了两个版本库:gitolite-admin.git和testing.git,其中的gitol-admin.git就是那个特殊的神奇版本库。所以,接下来我们要做的,就是回到你刚刚指定的超级管理员账户的电脑跟账户下,clone出gitolite-admin这个特殊的git版本库(当前情况下,只有该超级管理员账户可以clone并更新gitolite-admin这个版本库),然后根据自己的需要对其进行配置(如添加更多的管理员账户、添加新的版本库并为不同的用户指定权限)

su root# 回到指定的超级管理员账户  
git clone git@1127.0.0.1:gitolite-admin.git # clonegitolite-admin这个特殊的版本库

       如果上面的步骤都成功了的话,应该可以查看到有一个gitolite-admin的文件夹,文件夹下有两个目录conf、keydir
       如果你回到git用户,查看repositories目录(如果之前创建仓库时,创建的文件夹不是repositories,gitolite会自动创建这个文件夹,并将该文件夹作为默认访问时的默认路径),目录下就会多了gitolite-admin.git与testing.git两个版本库。有没有发现,这次clone的时候,没有指定决定路径,这一切gitolite已经自动帮你搞定了:默认路径是/home/git/repositories,权限控制是只有当前的超级管理员用户可以访gitolite-admin和testing两个版本库。如果你在repositories下边在创建一个空白仓库,比如helloworld

       现在使用git clone git@127.0.0.1:helloworld试图clone  
       FATAL: R any helloworld id_rsa DENIED by fallthru  
       (or you mis-spelled the reponame)  
       fatal: The remote end hung up unexppectedly   
       要继续访问这个项目,需要将这个项目添加到gitolite的权限控制内,下面演示一下为当前的超级管理员用户指定之前创建的helloworld测试版本库的读写权限(可读可写),以此演示gitolite指定权限的一般流程:
       1、将需要指定权限的用户的ssh公钥文件,存放在gitolite-admin版本库的keydir目录下(如果提交的都是id_rsa.pub,可以将其重命名为该用户的id或者名称,同时也推荐这样重命名,以明示哪个公钥文件是哪个用户的),因为我们初始化时,gitolite已经将该超级管理员的公钥文件自动拷进去了,所以省略此步骤
       2、编辑conf目录下的gitolite.conf文件,添加helloworld版本库管理组,为超级管理员指定读写权限(RW+,具体的权限定义,参考gitolite官方文档)

repo helloworld  
RW+  =   id_rsa  

       3、commit到本地

git commit -am 'add the helloworld repo and add RW+ to id_rsa'

       4、push到git仓库

git push

       如果push成功,当前超级管理员用户应该就可以成功clone helloworld版本库,并进行添加、删除、修改与push等操作了。

       最后需要指一下,gitolite本身回在你git commit东西到gitolite-admin仓库的使用时执行钩子脚本来更新权限,但是有的时候,这个钩子他又不起作用,即没有跟对你的操作来更新权限。

       这个情况下,如果你添加一个test用户,并且将test的公钥加入keydir和配置gitolite时,使用git clone git@127.0.0.1:helloworld时会报错误,错误消息是不存在helloworld仓库

       这时因为你设置的这个用户的公钥,没有被钩子捕捉到并更新信息,只能你自己来做了,其实也很简单,就是打开git用户.ssh/authorized_keys文件的内容,在里边仿照内容加以一句信息

       我的文件原有信息如下

command="/home/git/bin/gitolite-shell admin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAppSWxxxxxb8V4UZkNRVTZxxxxxxxOItP0iMVj9xssCKJamq97eAnqCSe4xqgHuAN7WFSchbzPNPYP5/KyPzZ/mMkYiWNY4OHNPhrD1MjzPDJGSpRL3UEJ2PyPQBJNUEhpFhBvG+4+lTAcF76jYDFewY8Oi6OW2Ka9v9QFn69oJ3pOSG/kTkbURYKfpZpSuy3RkpbfHaxOi1TT0X8OvutlYtHrj8/PwJEJ1I3kFVTLCDTuMqU/7h8aCN2OIlZvTdkuDx4G/l30cm1V4WuqJSoaB/MOMHhjm9CQJ52TuMtW92QVJ7JdKaXbG3XuK9F/1gyfrwgnw==root@iZ25hhocgq6Z

       这里边的每一行就是钩子本来需要去做的,你自己仿照上边格式的将test用户的公钥加上去,问题就解决了。这里注意一下 gitolite-shell 后边的参数,我贴出来的是admin,即公钥对应的gitolite权限管理的用户名,和gitolite.conf里的用户名。

2.安装perl 

访问规则示例

gitolite的访问规则功能强大,以下是示例:

repo foo
    RW+                     =   alice
    -   master              =   bob
    -   refs/tags/v[0-9]    =   bob
    RW                      =   bob
    RW  refs/tags/v[0-9]    =   carol
    R                       =   dave

规则解释:

  • alice对所有branch和tag拥有所有权限--create, push, delete, rewind/overwrite等等
  • bob可以创建或者fast-forward push名字中不以’master‘开头的branch,可以创建不以v+数字开头的tag
  • carol只可以创建v+数字开头的tag
  • dave只有只读权限,可以clone/fetch。

 

yum install perl

管理组

某些时候使用组来管理用户是非常方便的,下面是两个组:

@staff      =   alice bob carol
@interns    =   ashok
repo secret
    RW      =   @staff
repo foss
    RW+     =   @staff
    RW      =   @interns

组成员可以累加,下面对@staff的定义和上面的效果是一样的:

@staff      =   alice bob
@staff      =   carol

组也可以包含其他组:

@all-devs   =   @staff @interns

@all是一个特殊组名称,既可以指所有的仓库,可以指所有的用户。

当然,它一样是有缺点的,比如其学习曲线相对比较抖,但是只要你想学,网上系统的资料越来越多了。本人现在也基本算入门,本文也仅仅是一个备忘录,权当一个可能不大好的入门材料。本文的最后列出了一些可以更系统学习的资料。同时,git自身没有权限控制,需要额外的权限控制工具,但是现在也有不错的工具可以弥补了,本文也有举例介绍我自己当前在用的。

 

常用命令

客户端可以通过ssh远程执行一些命令,以下命令可以查看帮助:
ssh git@host help
info是最长用到的命令,在命令后跟上'-h'可以查看命令的用法。

在服务器端有非常丰富的使用命令,运行gitolite help查看详细信息。

 

3.安装openssh 

参考资料

https://github.com/sitaramc/gitolite

好,闲话说得够多了,下面开始介绍git的安装,包括git本身的安装,以及“服务器”上一些配套的管理工具的安装,包括用于权限管理的gitolite,用户web浏览文件的gitweb。

yum install openssh 

git安装

 

git安装

git自身的安装其实是很简单的,不论是windows下还是Linux下(以我自己用的ubuntu为例),尤其是如果你仅作为“客户端”(即别人不会直接从你的电脑上clone代码,不会向你的电脑提交或者获取代码),你只需要跟安装一个普通软件一样傻瓜式安装即可:

 

windows下直接下载可执行安装程序 msysgit (选择git for windows 或者 msysgit都可以),然后双击运行,根据提示安装即可,非常简单!

 

Linux的安装也很简单,尤其如果你用的Ubuntu或者Debian等有本地包管理系统的linux系统,一条命令即可解决问题(Ubuntu为例):

[plain] view plaincopy

 

 

  1. sudo apt-get install git-core  

 

首先,git的数据交换跟交互是基于ssh的,所以为了使所有成员都能从该机器上获取和提交代码,需要给系统配置ssh服务,当然,如果你已经配置了ssh服务,那么这一步就可以省了,所以你可以先通过下面的命令查看下自己是否已经配置了ssh服务:

[plain] view plaincopy

 

 

  1. ps -ef|grep "sshd"  

如果你能看到一些sshd相关的进程信息,则说明你已经有这个服务了,否则(或者你想更新的话),使用下面的命令安装openssh

[plain] view plaincopy

 

 

  1. sudo apt-get install openssh-server openssh-client  

然后,安装git“服务器”

[plain] view plaincopy

 

 

  1. sudo apt-get install git-core  

再然后,为自己配置身份信息,这样多个人提交代码的时候,就可以方便的查看是谁提交的,该如何联系ta了(如果该机器只做服务器,不做开发,本步骤应该可以省略)

[plain] view plaincopy

 

 

  1. git config --global user.name "yourname"  
  2. git config --global user.email "your@email.com"  

以上步骤是每个git用户都需要的,接下来,作为“服务器”,为了更好的管理,我们需要进行一些必要的配置!包括环境的配置、管理工具的安装与配置等。

 

首先,我们最好为其配置一个专门的git用户并设置密码,专门对代码进行管理

[plain] view plaincopy

 

 

  1. sudo useradd -m git  
  2. sudo passwd git(change to yours)  

 

说明:上述命令生成一个用户名与密码均为git的账户,也可以自己创建别的用户名跟密码,只要进行相关操作(比如clone)时指定用户名即可(本文章一律以git为例),-m 选项是让其在home目录下生成用户的主文件夹,我们的代码仓库会布置在这个主文件夹下。

 

然后,在新建的git用户主目录下创建一个文件夹作为git的仓库,并为这个仓库配备最基本的安防——权限控制

[plain] view plaincopy

 

 

  1. sudo mkdir /home/git/repositories # 最好使用repositories作为文件夹名称,这样可以简化后面的操作  
  2. sudo chown git:git /home/git/repositories  
  3. sudo chmod 755 /home/git/repositories  

至此,一个简单(非常简单)的git服务器已经搭建好了,可以自己创建一个简单的工程测试一下。

为了方便后面的操作,我们先切换到git用户下

[plain] view plaincopy

 

 

  1. su git  

在respositories下新建一个目录(仓库),并切换到这个目录

[plain] view plaincopy

 

 

  1. mkdir helloworld  
  2. cd helloworld  

在此处初始化一个空的仓库(只能接受push/pull代码,不能本地commit)

[plain] view plaincopy

 

 

  1. git --bare init  

好了,一个空的仓库建立好了,用另外一台安装了git的机器(比如你的开发机)测试一下,此处假设你上面所用的服务器IP为192.168.0.123

[plain] view plaincopy

 

 

  1. git clone git@192.168.0.123:/home/git/repositories/helloworld  

然后在开发机上进行一些基本操作测试:为这个项目add一些文件,然后commit,然后push,如果除了要几次输入git用户的密码外,其他一切正常的话,那说明上面的安装与配置就已经成功了

 

在上面的测试过程中,是不是发现那个clone的路径好长,很容易错?几个步骤都需要输入git用户的密码(clone、push),是不是很烦,而且照这个节奏,每增加一个开发成员,就得告诉他git用户的密码,是不是既繁琐又不安全?所以,如果能clone的时候只要指定项目名称,clone/push/pull自动完成身份认证,并且最好能对不同的仓库给予不同用户不同的权限,那就好了!接下来介绍的工具与配置就可以搞定这一切,让git仓库的管理变得更简单,操作更方便!

 

首先,针对身份认证的问题,我们前面已经提到git的数据交换与操作都是基于ssh的,所以,我们的身份认证自然可以通过配置ssh来解决。ssh是通过密钥进行认证管理的,密钥包括一个公钥(交给服务器)和一个私钥(自己保留),每个公钥对应一个私钥,每个私钥也只对应一个公钥。所以一个简单的解决自动身份认证的方式就是:每个需要访问代码仓库的人员,在自己的机器上通过ssh-keygen生成自己的公钥与私钥,将公钥提交给服务器,服务器管理员将改用户的公钥添加到服务器git用户的.ssh/authorized_keys文件中,可能用到的命令如下(Ubuntu终端/Windows下使用Git Bash):

[plain] view plaincopy

 

 

  1. # 某开发机上  
  2. ssh-keygen #接下来一路回车就好了,在默认目录下生成默认密钥文件  
  3. cp ~/.ssh/id_rsa.pub /path/to/one/visiabl/fold/ #将隐藏文件夹下的公钥文件拷贝到一个可以文件夹下(如果接下来用scp提交,此步骤可省略)  
  4. # 将上面的公钥文件以某种方式提交给服务器  
  5.   
  6. # 管理员在服务器下  
  7. # 将开发机提交上来的公钥文件,添加到/home/git/.ssh/authorized_keys文件中(每行一个)  

这种方式可以在开发人员较少,管理的仓库较少的时候使用,因为简单,但是其权限控制比较单一(均可以read/update代码),而且如果人一多,要管理authorized_keys文件也是个头疼的事情,所以不是很推荐这种方式,建议采用后面介绍的工具。

然后,对于默认路径的问题,这个我真的只知道通过下面的管理工具来配置了。所以,接下来介绍一个git仓库的开源管理工具gitolite

4.安装cpan(如果你的linux里面没有,就必须安装)

gitolite安装

gitolite它的主要功能就是对git仓库进行权限控制,并提供其他很多给力的方便管理的特性。其实我本来是要介绍gitosis的,但是自己在弄的时候,gitosis的配置出了一个非常诡异的问题,不管我怎么配置,甚至重新安装从零开始配置,总是再我更新它的配置文件后,之前的配置就不起作用了,折腾了我一天,最终发现了它的升级版——gitolite,所以决定采用它了。它们的本质都是上面介绍的ssh验证,只是它们提供更方便的管理方式,然后自动生成authorized_keys文件。这两个工具最有意思的一点就是,它们自身就是一个特殊的git版本库(gitolite-admin),他们的管理与配置都可以通过git的方式,分布式的进行修改,然后通过push的方式提交到服务器,服务器会通过所谓的钩子脚本自动更新权限控制文件。

下面介绍它的安装,它的官方主页上有详细的安装介绍,我这权当翻译跟经验分享。

首先,因为我的git仓库是在git用户下,所以,切换或者登陆到git用户下

[plain] view plaincopy

 

 

  1. su git  

上面说过,gitolite本质就是根据你的配置,自动生成authorized_keys文件,所以它要求你的authorized_keys文件必须是空的,或者不存在,所以我们干脆删了它(请注意一定要切换到git用户,否则,误删除了其他用户下的authorized_keys文件导致服务器的其他功能受影响,那就悲剧了,这应该也算是为什么要专门弄一个git用户来管理的原因吧)

[plain] view plaincopy

 

 

  1. rm ~/.ssh/authorized_keys  

然后,gitolite在初始化时需要通过某一用户的公钥文件指定一个超级管理员,gitolite安装成功后,只有这个超级管理员可以更新gitolite以更新各种权限控制(包括对其自身的更新权限控制),所以在初始化时需要指定该超级管理员账户的公钥文件(最好直接将其拷贝到git用户的主文件夹下)(下面的示例程序使用同一服务器上的另一常用管理员用户admin)

[plain] view plaincopy

 

 

  1. su admin  
  2. ssh-keygen  
  3. sudo cp ~/.ssh/id_rsa.pub /home/git/id_rsa.pub  
  4. su git  

好~准备工作已经完成了,开始安装gitolite

[plain] view plaincopy

 

 

  1. cd ~ # 回到git主文件夹下  
  2. git clone git://github.com/sitaramc/gitolite # 获取gitolite的源码  
  3. mkdir -p $HOME/bin  #为gitolite的二进制文件生成创建目录  
  4. gitolite/install -to $HOME/bin  # 编译生成安装文件  
  5. $HOME/bin/gitolite setup -pk id_rsa.pub # 安装并初始化,指定id_rsa.pub公钥文件对应的用户为超级管理员  

Bingo! gitolite安装完成!不过,你要用它来进行管理,那还需要一定的操作。上面提到,gitolite安装后本身是一个特殊的git版本库——gitolite-admin,分布式的进行修改,然后通过push的方式提交,其会通过钩子脚本执行权限更新。看一下上述步骤的最后一步你会发现,gitolite自动生成了两个版本库:gitolite-admin.git和testing.git,其中的gitol-admin.git就是那个特殊的神奇版本库。所以,接下来我们要做的,就是回到你刚刚指定的超级管理员账户的电脑跟账户下,clone出gitolite-admin这个特殊的git版本库(当前情况下,只有该超级管理员账户可以clone并更新gitolite-admin这个版本库),然后根据自己的需要对其进行配置(如添加更多的管理员账户、添加新的版本库并为不同的用户指定权限)

[plain] view plaincopy

 

 

  1. su admin # 回到指定的超级管理员账户  
  2. git clone git@192.168.0.123:gitolite-admin.git # clonegitolite-admin这个特殊的版本库  

如果上面的步骤都成功了的话,应该可以查看到有一个gitolite-admin的文件夹,文件夹下有两个目录conf、keydir

如果你回到git用户,查看repositories目录(如果之前创建仓库时,创建的文件夹不是repositories,gitolite会自动创建这个文件夹,并将该文件夹作为默认访问时的默认路径),目录下就会多了gitolite-admin.git与testing.git两个版本库。

有没有发现,这次clone的时候,后面的路径变短了?密码也不用输了?腰不酸腿不痛了?对,你没猜错,这一切gitolite已经自动帮你搞定了:默认路径是/home/git/repositories,权限控制是只有当前的超级管理员用户可以访问gitolite-admin和testing两个版本库,你之前测试创建的版本库也已经无法访问,如果你尝试再次clone之前创建的测试版本库,应该就会提示如下错误信息:

[plain] view plaincopy

 

 

  1. # 假设你之前创建了helloworld版本库,现在使用git clone git@192.168.0.123:helloworld试图clone  
  2. FATAL: R any helloworld id_rsa DENIED by fallthru  
  3. (or you mis-spelled the reponame)  
  4. fatal: The remote end hung up unexppectedly   

要继续访问之前创建的项目,需要将这个项目添加到gitolite的权限控制内,下面演示一下为当前的超级管理员用户指定之前创建的helloworld测试版本库的读写权限(可读可写),以此演示gitolite指定权限的一般流程:

1、将需要指定权限的用户的ssh公钥文件,存放在gitolite-admin版本库的keydir目录下(如果提交的都是id_rsa.pub,可以将其重命名为该用户的id或者名称,同时也推荐这样重命名,以明示哪个公钥文件是哪个用户的),因为我们初始化时,gitolite已经将该超级管理员的公钥文件自动拷进去了,所以省略此步骤

2、编辑conf目录下的gitolite.conf文件,添加helloworld版本库管理组,为超级管理员指定读写权限(RW+,具体的权限定义,参考gitolite官方文档)

[plain] view plaincopy

 

 

  1. repo helloworld  
  2.     RW+  =   id_rsa  

3、commit到本地

[plain] view plaincopy

 

 

  1. git commit -am 'add the helloworld repo and add RW+ to id_rsa'  

4、push到git仓库

[plain] view plaincopy

 

 

  1. git push  

如果push成功,当前超级管理员用户应该就可以成功clone helloworld版本库,并进行添加、删除、修改与push等操作了。

以上便是一个经典的管理过程,至于具体的权限控制、配置文件的格式、更多高级功能等,如果都介绍的话,这文章也太长了,所以读者还是参考官方文档(简单介绍,详细版本)吧,顺便学学英语。

 

一个基本的git服务器算基本完成了,当然如果要管理好,里面涉及到管理细节(不论是技术细节,还是管理策略)还有很多很多,我自己现在也只知道些皮毛,同时因为没有大项目的代码管理经验,都是我自己的小打小闹,所以就完全不敢出来献丑了,更多技术细节,大家可以查看官方文档,有机会我也许会再做点笔记分享,至于管理策略,推荐这个:A successful Git branching model ,这个也有”中文版“

 

yum install cpan

git基本操作

其实这个已经有很多不错的资料了,所以也就懒得自己写了,罗列一点自己看过的资料好了:

我第一次接触git时,大哥推荐给我的资料:Git魔法,有pdf版本的,读者自己找找吧,如果没找到,也可以找我要,仅限学习~

git官网貌似一直就没上去过,看看这个中文翻译版本吧

一个不错的git简易指南

1.在服务器端创建专用帐号,所有用户通过此帐号访问git库,一般方便易记,选择git作为专用帐号名称。
$sudo adduser --system --shell /bin/bash --group git
添加git用户到ssh用户组中
$sudo adduser git ssh
为git用户设置口令,当整个git服务配置完成,最好取消git口令,只允许公匙认证。
$sudo passwd git
 2.到管理员主机将管理员公匙添加到服务器主机的.ssh/authorized_keys文件中,建立新的公匙认证,如:
$ssh-copy-id -i .ssh/<filename>.pub  git@server

3.服务器切换到git用户
$su git
安装gitolite
$sudo apt-get install gitolite
执行gitolite安装
$gl-setup  /<filename>.pub 以管理员公匙安装gitolite
安装过程会询问是否修改配置文件,一般会自动打开vi编辑.gitolite.rc文件。有些配置需要修改
$REPO_BASE="repositories"
用于设置Git服务器的根目录,缺省是git用户主目录下的repositories目录,可以使用绝对路径。所有git库都
部署在该路径下。
$REPO_UMASK=0007;#gets you 'rwxrwx--'
版本库创建使用的掩码。即新建立的版本库权限为‘rwxrwx’
$GL_BIG_CONFIG=0
如果授权文件非常复杂,更改此项配置为1,以免产生庞大的授权编译文件。
$GL_DILDREPOS=1
支持通配符版本库授权。
退出保存。
如果安装时没有配置,后续可以打开git用户跟目录下.gitolate.rc文件配置。

4.管理gitolite
当gitolite安装完成后,在服务器端创建了一个用于管理gitolite的库gitolite-admin.git

切换到管理员主机  $git clone git@server:gitolite-admin.git
$cd gitolite-admin
$ls -F
conf/   keydir/
$ls /conf
gitolite.conf
$ls keydir/
<filename>.pub
我们可以看出gitolite-admin目录下有两个目录conf/和keydir/.
keydir/<filename>.pub文件
目录keydir下初始时只有一个用户公匙,及管理员用户的公匙。
conf/gitolite.conf文件
该文件为授权文件,初始内容为
#gitolite conf
# please see conf/example.conf for details on syntax and features

repo gitolite-admin
    RW+                 = admin

repo testing
    RW+                 = @all

缺省授权文件中只设置了两个版本库的授权:

    gitolite-admin

    即本版本库(gitolite管理版本库)只有 admin 用户有读写和强制更新的权限。

    testing

    缺省设置的测试版本库,设置为任何人都可以读写以及强制更新。

5.增加新用户
只用将信用户的公匙添加到gitolite-admin版本库的Keydir目录下,即完成新用户的添加。如:
$ cp /path/to/dev1.pub keydir/
$ cp /path/to/dev2.pub keydir/
$ cp /path/to/jiangxin.pub keydir/
执行 git add 命令,将公钥添加入版本库。

$ git add keydir
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   keydir/dev1.pub
#       new file:   keydir/dev2.pub
#       new file:   keydir/jiangxin.pub
#
$ git commit -m "add user: jiangxin, dev1, dev2"
[master bd81884] add user: jiangxin, dev1, dev2
 3 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 keydir/dev1.pub
 create mode 100644 keydir/dev2.pub
 create mode 100644 keydir/jiangxin.pub

执行 git push,同步到服务器,才真正完成新用户的添加。

$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1.38 KiB, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: Already on 'master'
remote:
remote:                 ***** WARNING *****
remote:         the following users (pubkey files in parens) do not appear in the config file:
remote: dev1(dev1.pub),dev2(dev2.pub),jiangxin(jiangxin.pub)

6.更改授权
新用户添加完毕,可能需要重新进行授权。更改授权的方法也非常简单,即修改 conf/gitolite.conf 配置文件,提交并 push。

    管理员进入 gitolite-admin 本地克隆版本库中,编辑 conf/gitolite.conf 。

    $ vi conf/gitolite.conf

    授权指令比较复杂,我们先通过建立新用户组尝试一下更改授权文件。

    考虑到之前我们增加了三个用户公钥之后,服务器端发出了用户尚未在授权文件中出现的警告。我们就在这个示例中解决这个问题。

        例如我们在其中加入用户组 @team1,将新添加的用户 jiangxin, dev1, dev2 都归属到这个组中。

        我们只需要在 conf/gitolite.conf 文件的文件头加入如下指令。用户之间用空格分隔。

        @team1 = dev1 dev2 jiangxin
编辑结束,提交改动。

$ git add conf/gitolite.conf
$ git commit -q -m "new team @team1 auth for repo testing."

执行 git push ,同步到服务器,才真正完成授权文件的编辑

7.创建仓库示例
在conf/gitolite.conf中添加类似下面的内容进去
repo notes
  PW = <filename>
保存,提交,并推送到服务器
git add -u
git commit -m 'add new repo notes '
git push
推送的时候应该看到类似这样的信息

Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 395 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Initialized empty Git repository in /home/git/repositories/notes.git/
To git@desktop:gitolite-admin
   6de90b8..52737aa  master -> master

注意remote开头的一行,它已经帮你创建了这个仓库

通配符创建仓库示例
通配符仓库事先不能确定名字,所以不会帮你创建,在你clone的时候才会创建

编辑conf/gitolite.conf文件在里面加入类似下面的内容

repo e2source/.+$
  C      =   <filename>
  RW+C   =   <filename>

注意C = username的一行必不可少,这里的C是指创建仓库的意思,下一行的RW+C中的C是指创建引用(branch,tag)的意思

保存后提交并推送到服务上去

git add -u
git commit -m 'add wildcard repo'
git push

注意看push时输出的信息,应该没有创建仓库的信息

这时filename克隆仓库的时候会自动创建

# as filename user
git clone git@server:e2source/enigam2-plugins.git

输出应该类似这样

Cloning into 'enigam2-plugins'...
Initialized empty Git repository in /home/git/repositories/e2source/enigam2-plugins.git/
warning: You appear to have cloned an empty repository.

如果你的输出报这样的错

FATAL: R any e2source/enigam2-plugins jenny DENIED by fallthru
(or you mis-spelled the reponame)
fatal: The remote end hung up unexpectedly

一般是没有C = username这一行,注意是只有C的一行

 

5.准备两个用户(这两个用户可以是自定义的,并且他们相互之间没有读取对方目录的权限,不然会绕过gitolite,在执行update的hook的时候报环境变量的错误),这里为了好区分就用git和gitadmin。

useradd git

 

passwd git

 

useradd gitadmin

 

passwd gitadmin

 

这两个命令的作用分别是添加用户和为改用户设置密码

二、配置步骤

1.首先切换到gitadmin登录

su gitadmin

 

2.在gitadmin这个用户下生成公钥和秘钥

ssh-keygen

 

执行该命令后,公钥和密码会默认为rsa算法,并且保存在该用户的.ssh目录下,也就是/home/git/.ssh/id_rsa。

如果想查看生成的公钥和秘钥可以执行cd /home/git/.ssh/,id_rsa就是秘钥,id_rsa.pub就是公钥

3.把gitadmin的公钥复制出来

cp  id_rsa.pub  tmp/gitadmin.pub

 

这里复制的目的是为了等下切换git用户可以设置该公钥为具有管理git仓库权限的公钥,所以这里就直接放在tmp目录下了。

官方规范,把公钥的名字设为用户的名字,以便区分。

4.这里切换git用户

su git

 

这里的git用户主要是用来放git仓库和设置管理员的权限的。

确保~/.ssh/authorized_keys是空的或不存在的,authorized_keys是用来存储所有使用gitolite的用户的公钥的

5.切换到该用户的用户目录并安装gitolite

cd

 

git clone https://github.com/sitaramc/gitolite

 

mkdir -p $HOME/bin

gitolite/install -to $HOME/bin

 

然后设置git的管理员,也就是我们的gitadmin

$HOME/bin/gitolite setup -pk /tmp/gitadmin.pub

 

到这里gitolite和管理员已经设置完成了

三、添加用户和推送配置

gitolite的所有添加仓库和用户还有设置权限都要通过gitadmin来推送,配置才能生效。

1.现在切换回gitadmin用户

su gitadmin

 

然后回到gitadmin的用户目录,为了是把等下克隆的gitolite的管理仓库,直接放在用户目录下便于查找

cd

 

2.克隆在gitolite管理配置

git clone git@127.0.0.1:gitolite-admin这个地址格式要注意规范,地址写127.0.0.1是因为在同一台服务器,如果想用其他服务器可以更换地址。

`特别要注意的是不能写成git clone git@127.0.0.1:/home/git/repostories/gitolite-admin,这样的写法也能克隆到项目,但是并不是通过gitolite来触发的。`

``绕过gitolite的后果会导致后面推送的时候触发update.pm这个hook报环境变量错误。如果没有成功地使用gitolite来克隆项目,是会提示你要输入这个账号的密码。

当出现密码提示的时候,请返回查看之前的操作步骤有没有遗漏,否则,后面的很多操作都无法实现。

``因为我们前面已经为gitadmin配置了管理权限的公钥,理论是可以直接克隆成功的。

``3.打开gitolite-admin

cd gitolite-admin

 

会看到有conf和keydir两个文件夹

conf用来添加或删除仓库,还有配置用户的分组还有每个用户/分组的读写执行权限,查看权限操作可以直接往后拉。

keydir用来保存每个使用gitolite的用户的公钥,推送成功后,会在git用户的authorized_keys生成对应公钥。

三、使用gitolite的来管理用户的权限

1.打开另一台客户端(我本机使用的是windows系统)

直接输入

ssh-keygen

 

 

大回车连续啪啪啪三次,就会在你C盘用户目录的.ssh文件夹下面生成一对公钥秘钥

2.把公钥移到服务器端gitadmin用户的keydir目录中。

这里有两种方法可以用:

1)下一个winSCP,直接把文件拖过去。记得改一下名字,如:waldon.pub

2)直接在客户端使用命令

scp C://Users/waldon/.ssh/id_rsa.pub gitadmin@host:/home/gitadmin/gitolite-admin/keydir/waldon.pub

 

这里host是你服务器的ip地址,waldon是我本机的用户名。

提示输入gitamdin的密码后,就会看到上传公钥到服务器成功了。

3.我们再切回root用户,创建一个新用户叫waldon。这个用户名要和你公钥的名字一致

su root

 

useradd waldon

 

passwd waldon

 

4.切换回gitadmin,打开conf文件夹,编辑gitolite.conf文件

su gitadmin

 

cd /home/gitadmin/gitolite-admin/conf

 

vim gitolite.conf

 

5.为用户配置权限

在gitolite-admin仓库下添加刚刚配置的用户waldon

repo gitolite-admin
RW+ = gitadmin waldon

 

按esc然后:wq保存退出

6.推送配置到git服务器

1)cd /home/gitadmin/gitolite-admin  回到gitolite-admin文件夹下

2)git status  查看当前仓库的变化,这里应该会显示keydir/waldon.pub 和 conf/gitolite.conf 两个变更文件

3)git add .  添加所有变动

4)git commit -m "这里的提交注释随便填"  提交所有变动

5)git push  推送配置,如果不想看到出现的警告,也可以用git push -u origin master 来具体到推送分支

如果对这里的命令不熟悉可以去看看git的相关命令,如果出现要你配置邮箱和用户名的提示,按他提示的格式输入即可。

7.切换回git用户,查看配置是否成功。

su git 

 

cd /home/git/.ssh

 

cat authorized_keys

 

当秘钥出现新的用户,就代表新增用户成功了。

最后是一些简单的仓库权限配置,gitolite大部分的权限配置只是针对推送的。git的原意就是开源,分享代码,gitolite的出现已经很变态了,如果还想控制其他人读取代码目录的

权限,那还是用SVN吧。

金沙棋牌 1

 

所有的一切操作,除了切换用户,都是不需要密码的,因为秘钥会自动匹配,如果出现了需要密码的操作,有可能是你绕过了gitolite,

会造成钩子触发失败的操作,从而导致推送失败。

 

 

 

 

 

 

 

 

 

本文由金沙棋牌发布于操作系统,转载请注明出处:上搭建git服务器和配置gitolite权限管理,git服务器

关键词: