美文网首页程序员
git服务器搭建及gitolite 基本语法

git服务器搭建及gitolite 基本语法

作者: 赵国开 | 来源:发表于2018-02-11 20:07 被阅读0次

    2015年在Ubuntu 14.04.4 LTS trusty版本上用gitolite搭建git服务器时写的一个记录手册。今天整理了一下,发出来:)


    1 ssh公钥和私钥的生成

    ssh-keygen -t rsa
    

    生成的密钥默认存放位置(Linux和window系统都一样)

    ~/.ssh
    

    生成两个密钥id_rsa(私钥) 和 id_rsa.pub(公钥)

    公钥需要提供给需要默认登录的服务器做授权用,授权之后,不用每次登录的时候都需要输入密码,服务器会用公钥自动进行判断是否授权。

    2 gitolite安装

    • 创建一个给git用的帐号这里用git,当然也可以选一个自己更喜欢的
    useradd -m git
    
    • 给帐号创建密码
    passwd git
    
    • 切换到git帐号
    su git
    
    • 下载并安装
    git clone git://github.com/sitaramc/gitolite
    mkdir -p $HOME/bin
    gitolite/install -to $HOME/bin
    
    • 把新的bin目录加到PATH
    vim    ~/.bashrc
    

    在末尾加入下面这一行,保存并退出

    export PATH=/home/git/bin:$PATH
    

    重新载入.bashrc

    source .bashrc
    
    • 增加管理员公钥

    这里以zgk用户为例。把zgk用户home目录下 ~/.ssh目录下的 id_rsa.pub改名为zgk.pub并放到git的~目录下

    gitolite setup -pk zgk.pub
    
    • 装好之后版本库存储位置
    /home/git/repositories
    
    • 刚装完之后该目录下有两个仓库
    gitolite-admin.git  
    testing.git
    

    其中gitolite-admin.git是给管理员用来增减用户,新建版本库,和开放相应权限的地方。其实它就是一个git的仓库。管理员如果需要修改相关的配置,可以先把该仓库clone到自己的目录,修改完之后在push到服务器,修改就能生效。

    而 testing.git就是一个测试的仓库,可以给不熟悉git的新手用来练练手它的权限是对所有人开放的。

    • 测试安装是否成功

    切换到zgk用户

    su zgk
    git clone git@127.0.0.1:gitolite-admin
    #或者
    git clone git@127.0.0.1:testing
    

    都可以不用密码clone下来说明已经安装成功

    如果需要加repositories前缀才能clone下来(git clone git@127.0.0.1:repositories/gitolite-admin),说明密钥可能有问题

    • 增加windows下tortoisegit新用户zgkxp

    这一步不是必须的,看自己是否需要在Windows下面操作git仓库,如果不需要就跳过。

    生成密钥对

    ssh-keygen -t rsa
    

    服务器下zgk用户家目录

    git clone git@127.0.0.1:gitolite-admin
    

    把公钥改名为zgkxp.pub并放到gitolite-admin/keydir目录下

    git add .
    git commit -m “add user zgkxp”
    git push
    

    添加完毕

    windows下右键打开git bash去登录服务器x.x.x.x(git服务器内网ip)

    git clone git@x.x.x.x:testing

    如果可以clone下来并且不需要密码输入说明已经添加成功

    • 删除用户

    把gitolite-admin/keydir目录下对应的用户删除掉在push到服务器就会把相应的用户删除

    3 配置文件的语法简单介绍(conf/gitolite.conf)

    用来管理,代码库的创建,控制用户对相关代码库的访问权限

    具体可参考官网手册,http://gitolite.com/gitolite/conf.html

    3.1 基本语法

    (1)注释,以“#”作为注释的开发
    (2)没有续行符“\”
    (3)所有的东西都是用空格作为分隔符(不用逗号,分号等)
    (4)用户名和代码库名可以包含"."、"_"、"-"等,代码库可以包含"/",用户名可以有“@”
    (5)组名必须以@开始

    3.2 组的定义

    用户组和代码库组定义是一样的两者没差别。

    • 简单的例子定义了一个组
    @developers     =   dilbert alice wally
    
    • 组的值是累积的所以也可以按下面这么定义,和上面的一样
    @developers     =   dilbert
    @developers     =   alice
    @developers     =   wally
    
    • 组的定义可以嵌套,但值是立即展开的,也就是说后面定义的值,不会在加的嵌套的组里面
    @developers     =   dilbert alice
    @interns        =   ashok
    @staff          =   @interns @developers
    @developers     =   wally# wally 用户并不属于 @staff 组
    
    • 正常使用的一个例子
    @developers     =   dilbert alice wally
    @foss-repos     =   git gitoliterepo @foss-repos    
    RW+=   @developers
    

    @all是一个特殊组,它可以包括所有的用户或者所有的代码库

    3.3 访问规则

    访问规则一般由四部分组成
    代码仓库名, 用户名, 操作, 和ref

    (1)"repo"行
    可以跟一个或者多个代码仓库,也可以跟组名,或者用正则表达式也可以。
    (2)规则行
    从"repo"开始到下一个"repo"出现之前的行都属于规则行,一般是
    权限域 refex = 用户名或者组名等

    repo foo bar
    RW+= alice @teamleads 
    - master = dilbert @devteam 
    - refs/tags/v[0-9] = dilbert @devteam 
    RW+ dev/ = dilbert @devteam 
    RW= dilbert @devteam 
    R= @managers
    
    • 权限域里常用的权限
      • R, 只读
      • RW, 允许 push 一个分支 branch, 或者创建一个 branch/tag
      • RW+, 可以快速推送, 倒回或者删除 branches or tags
      • - 拒绝访问

    (3)refex
    用来匹配代码仓库的引用(ref),一般使用正则表达式来表示
    如果没有指定refex,则是以refs/.*作为默认值,比如

    RW              =   alice
    

    如果不是以refs/作为开始,则认为以refs/heads/开始,比如

    RW  master      =   alice# becomes 'refs/heads/master' internally
    

    如果是对tag进行限制,则必须写全

    RW  refs/tags/v[0-9]    =   bob
    

    refex默认开头是固定的,但是结尾可以随意匹配,换句话说就是有正则表达式的“^”在开头但是没有“$”在结尾,比如只指定master的话,下面这些对它都匹配

    refs/heads/master
    refs/heads/master1
    refs/heads/master2
    refs/heads/master/full
    

    而对refs/tags/v[0-9], v1 , v12, v1.2,v12345这些都是对的。
    如果你不想随意匹配的话,那在表达式后面加个$就行了,比如

    RW  master$     =   alice
    

    (4)需要注意的是=后面的用户名或者组名不能使用正则表达式来表示。

    一个例子:

    # managers should be able to read any repo
    repo @all    
    R=   @managers# ...other rules for other repos...
    repo foo bar
    RW+             =   alice @teamleads    
    -   master         =   dilbert @devteam   
    -   refs/tags/v[0-9]  =   dilbert @devteam   
    RW+ dev/          =   dilbert @devteam   
    RW               =   dilbert @devteam    
    R                 =   @managers
    

    补上默认值,等效于下面

    1 # managers should be able to read any repo 
    2 repo @all 
    3     R   refs/.*             =   @managers 
    4  
    5  # ...other rules for other repos... 
    6  
    7 repo foo bar
    8  
    9     RW+ refs/.*               =   alice @teamleads
    10     -   refs/heads/master   =   dilbert @devteam
    11     -   refs/tags/v[0-9]    =   dilbert @devteam
    12     RW+ refs/heads/dev/     =   dilbert @devteam
    13     RW  refs/.*               =   dilbert @devteam
    14     R   refs/.*               =   @managers
    

    (5)规则累积

    repo 不一定是在一处要全部指定完,可以在别处补充,也可以被其它repo间接补充
    比如

    repo foo     # ...some rules...# ...other repos and rules...
    repo foo     # ...more rules for foo...
    # managers should be able to read any repo
    repo @all    
        R=   @managers
    # anyone can clone open source repos
    repo @FOSS    
        R=   @all
    

    3.4 规则检查

    用户dilbert 对foo代码仓库的任何ref(any)的W权限检查

    gitolite access -s foo dilbert W any
    

    类似的其他检查

    gitolite access -s foo dilbert W xyz
    gitolite access -s foo dilbert + refs/heads/xyz
    

    4 增加、移除、重命名一个代码仓库

    服务器下zgk用户家目录

    git clone git@127.0.0.1:gitolite-admin
    

    编辑gitolite-admin/conf目录下gitolite.conf 文件

    • 比如添加一个bar仓库(conf语法可以参考上一节的介绍)
    repo bar    
    RW+=   alice
    
    git add .
    git commit -m “add user zgkxp”
    git push
    

    添加完毕

    • 要移除一个代码仓库,类似要编辑gitolite.conf 文件,删除对应的行并提交。但服务器的代码仓库并不会自动移除需要自己手动去移除。

    • 重命名一个仓库按下面顺序(注意顺序)
      (1)到服务器上把对应的仓库名字改掉,注意要保留“.git”后缀
      (2)改变gitolite.conf中仓库的名字,并提交到服务器


    附录1 SSH背景知识

    ssh主要是用RSA进行加密的,RSA是非对称的,什么是非对称,就是你加密的密钥和解密的密钥用的不是同一个密钥,用RSA就必须用到两个密钥一个叫公钥(加密用),一个叫私钥(解密用)。

    • 客户端用户和服务器大致的通信过程
      客户端[客户端的私钥,解 密]<--------------服务器[客户端给的公钥,加密]
      客户端[服务器给的公钥,加密]-------------->服务器[服务器的私钥,加 密]

    • 第一次连接

                       请求
    客户端[公/私钥]----------------->服务器[公/私钥]
                      服务器公钥
    客户端[公/私钥]<-----------------服务器[公/私钥]
                      客户端公钥
    客户端[公/私钥]------------------>服务器[公/私钥]
    
    • 客户端公/私钥一般存放的位置:

    私钥 ~/.ssh/目录
    公钥 ~/.ssh/know_hosts/目录

    • 服务器公/私钥一般存放的位置:
      /etc/ssh/ssh_host*

    • 自动授权登录:把公钥加到authorized_keys文件(默认是该文件,如果sshd_config的AuthorizedFile有指定其他的就把其加到对应的文件就行)

    相关文章

      网友评论

        本文标题:git服务器搭建及gitolite 基本语法

        本文链接:https://www.haomeiwen.com/subject/pwdltftx.html