使用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. 

原创:https://juejin.im/post/5f1257386fb9a07ebc7b6a0d

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

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

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

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

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

最新回复(0)
/jishuxl9eRxrOWkFLJs7Cw6Hb4NzloDHxh6hVNOLkAg_3D_3D
8