• 使用Gitolite搭建Git服务器


    Git服务的管理工具,主要有如下几种。

    • Gitosis- 轻量级, 开源项目,使用SSH公钥认证,只能做到库级的权限控制。目前项目已经停止开发,不再维护。

    • Gitolite - 轻量级,开源项目,使用SSH公钥认证,能做到分支级的权限控制。

    • Git + Repo + Gerrit - 超级重量级,集版本控制,库管理和代码审核为一身。可管理大型及超大型项目。Android平台使用的就是这种方案。

    • GitLab-是GitHub的开源版本,使用和配置比较复杂,适合大型团队、资源密集型开发的管理工具

    Gitolite使用perl语言编写,维护和更新比较积极,下面测试使用Gitolite搭建Git服务器。

    Gitolite的安装

    • 新建用户Git服务器用户gitolite(用于存放管理Git公钥和仓库)
    adduser gitolite
    
    • 使用gitolite用户登陆服务器
    $ su - gitolite
    密码:
    
    • 确保家目录~/.ssh/authorized_keys是空的或者不存在

    一般新建用户~/.ssh/目录是不存在的。

    • 客户端生成ssh密钥,并将公钥上传到服务器的Gitolite用户家目录下
    $ ssh-keygen -t rsa
    

    生成路径会在ssh-kengen执行后给出,也可修改。windows下生成路径默认位于C:/user/用户名/.ssh下。

    • 上传客户端的公钥到gitolite用户家目录下
    $ pscp C:/Users/win7hostsver/.ssh/id_rsa.pub gitolite@192.168.1.18:git1.pub
    
    • 在服务器端下载gitlite
    git clone https://github.com/sitaramc/gitolite
    
    • 创建bin目录,并将gitolite安装到bin目录下
    mkdir -p $HOME/bin
    gitolite/install -to $HOME/bin
    
    • 将上传的公钥git1.pub设置为gitolite的超级管理员
    $HOME/bin/gitolite setup -pk git1.pub
    初始化空的 Git 仓库于 /home/gitolite/repositories/gitolite-admin.git/
    初始化空的 Git 仓库于 /home/gitolite/repositories/testing.git/
    WARNING: /home/gitolite/.ssh/authorized_keys missing; creating a new one
        (this is normal on a brand new install)
    

    此时,gitolite会初始化两个仓库,同时创建authorized_keys文件

    也可以将gitolite命令路径加入到系统环境变量,这样可以在任何路径使用gitolite

    • 客户端克隆授权管理仓库
    $ git clone gitolite@192.168.1.18:gitolite-admin
    

    管理库中有两个目录,conf/keydir/

    1. conf/gitolite.conf 用于Git项目配置,访问权限设置。

    2. keydir/ 用于存储用户的SSH public key(公钥)。

    配置Git服务器的项目

    添加新的Git项目仓库到本地

    仓库的创建通过编辑gitolite-admin/conf/gitolite.conf即可,然后将配置后的文件上传服务器。

    • gitolite.conf中添加如下两行,新建一个repo1的仓库:
    repo repo1
        RW+     =   @all
    

    gitolite.conf管理仓库有三种权限, RW+、RW、R

    权限可以赋值给@all所有有用户;或添加到keydir目录中的公钥对应的某一个用户(公钥文件的名字为RW+值)

    git1.pub公钥文件,RW+ = git1

    • 添加并提交修改到gitolite-admin
     git add .
     git commit -m "added repo1 gave access to all"
    [master 613f720] added repo1 gave access to all
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    • 推送到远程服务器,gitolite会在服务器创建对应的git仓库
     git push
    Counting objects: 8, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (6/6), done.
    Writing objects: 100% (8/8), 703 bytes | 175.00 KiB/s, done.
    Total 8 (delta 1), reused 0 (delta 0)
    remote: 初始化空的 Git 仓库于 /home/gitolite/repositories/repo1.git/
    To 192.168.1.22:gitolite-admin
       f68d497..613f720  master -> master
    
    • 服务器端repositories/仓库库目录下会多出一个空仓库repo1
    $ ls -al repositories/
    总用量 20
    drwx------  5 gitolite gitolite 4096 5月   7 21:10 .
    drwxr-xr-x 10 gitolite gitolite 4096 5月   7 21:10 ..
    drwx------  8 gitolite gitolite 4096 5月   7 21:10 gitolite-admin.git
    drwx------  7 gitolite gitolite 4096 5月   7 21:10 repo1.git
    drwx------  7 gitolite gitolite 4096 5月   7 21:10 testing.git
    
    • 客户端直接克隆
    $ git clone gitolite@192.168.1.22:repo1.git
    Cloning into 'repo1'...
    warning: You appear to have cloned an empty repository.
    

    本地现有仓库添加到服务器

    若本地已有仓库repo2,将其添加到服务器

    • gitolite.conf中配置仓库repo2
    repo repo2
        RW+     =   git1
    

    新用户要将其公钥添加到/keydir目录

    • 添加、提交和push
    git add .
    git commit -m "added repo2 gave access to git1"
    git push
    
    • 本地配置远程服务器
    git remote add origin gitolite@192.168.1.22:repo2.git
    
    • 推送本地仓库
    git push origin master
    

    权限规则示例

    repo foo
        RW+                     =   alice
        -   master              =   bob
        -   refs/tags/v[0-9]    =   bob
        RW                      =   bob
        RW  refs/tags/v[0-9]    =   carol
        R                       =   dave
    
    • alice对foo仓库有最高权限,创建、推送、删除、回退、覆写等

    • bob对非master开头的分支和非v+数字开头的标签进行创建和推送

    • carol能够创建以v+数字开头的标签。

    • dave可以克隆和fetch(拉取)

    组groups管理

    gitolite可以通过用户组的方式进行管理

    gitolite.conf类似于变量的形式管理组,并且非常灵活

    @admins     =   macken steven
    
    @engineers = macken steven wally alice
    
    @staff = @admins @engineers
    
    @interns    =   ashok
    
    repo secret
        RW      =   @staff
    
    repo foss
        RW+     =   @admins
        RW      =   @interns
    
    • 同时可以使用正则对分支和标签进行匹配授权
    RW int$ = @interns  # @interns组只对以“int”结尾的分支有创建和推送权限
    RW eng- = @engineers    # @engineers组只对以“eng-”开头的分支有创建和推送权限
    RW refs/tags/rc[0-9] = @engineers   # @engineers组只对以“rc[0-9]“开头的标签有创建和推送权限
    RW+ = @admins   # @admins组则对仓库有最高权限
    

    遇到的报错

    $ git clone gitolite@192.168.1.18:gitolite-admin
    Cloning into 'gitolite-admin'...
    gitolite@192.168.1.18's password:
    fatal: 'gitolite-admin' does not appear to be a git repository
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    

    如上提示,需要输入密码。
    需要安装openssh,并将gitolite用户添加在sshusers组中,有的服务器可能是ssh组。

    SSL(Secure Sockets Layer)安全套接字层,主要用来加密数据传输

    SSH (Secure SHell)安全shell,实现对所有传输的数据进行加密。这样“中间人”攻击方式就不可能实现了,并且数据经过压缩,传输速度快。

    openssh依赖于openssl,openssl是一个安全套接字层密码库,包括主要的密码算法、常用密钥和证书封装管理及SSL协议。

    OpenSSH是SSH协议的实现,实现过程中,需要用到密钥交换算法,对称/非对称加密算法,Mac算法,随机数算法。会用到OpenSSL的libcrypto库{openssl还有libssl库}。

    计算机领域的Cookbook指的是实用经典案例的意思,是对一些普遍性问题的解决方案的总结和整理。

    参考

    作者: 代码迷途
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意原创文章必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    非原创文章若有需要,建议直接联系原文作者或保留声明情况下转载原文
  • 相关阅读:
    python操作MySQL数据库
    用python监控您的window服务
    关于position定位中的几个注意点
    filter 滤镜
    git使用心得
    :after,:before,content
    outline和border
    《css揭秘》之背景与边框
    css权威指南学习笔记--第6章
    浅谈setTimeout和setInterval
  • 原文地址:https://www.cnblogs.com/codemissing/p/Gitolite_make_gitserver.html
Copyright © 2020-2023  润新知