【ubuntu】 安装配置 gitolite 管理 超详细 持续更新中

  • 在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。
  • 而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

【ubuntu】 安装配置 gitolite 管理 超详细 持续更新中

  • [【ubuntu】 安装配置 gitolite 管理 超详细 Git仓库权限管理玩得溜!持续更新](#【ubuntu】 安装配置 gitolite 管理 超详细 Git仓库权限管理玩得溜!持续更新)
  • [一、Gitolite 介绍](#一、Gitolite 介绍)
    • [1.1 为啥非要用Gitolite?🤔](#1.1 为啥非要用Gitolite?🤔)
    • [1.2 Gitolite核心原理 🧠](#1.2 Gitolite核心原理 🧠)
    • [1.3 总结](#1.3 总结)
    • [1.3 Gitolite vs 同类工具](#1.3 Gitolite vs 同类工具)
  • [二、环境准备 🛠️](#二、环境准备 🛠️)
  • [三、安装 Gitolite](#三、安装 Gitolite)
    • [3.1 下载Gitolite](#3.1 下载Gitolite)
    • [3.2 安装Gitolite](#3.2 安装Gitolite)
    • [3.3 操作示例](#3.3 操作示例)
  • 四、生成git用户的公私钥
    • [4.1 生成Git用户的公私钥](#4.1 生成Git用户的公私钥)
    • [4.2 操作示范](#4.2 操作示范)
  • 五、生成管理员的公私钥
    • [5.1 生成 qiuwenxiong 的key](#5.1 生成 qiuwenxiong 的key)
    • [5.2 操作示例](#5.2 操作示例)
  • 六、拷贝管理员公钥到git
    • [6.1 拷贝管理员 qiwuenxiong 公钥 到 git](#6.1 拷贝管理员 qiwuenxiong 公钥 到 git)
    • [6.2 操作示例](#6.2 操作示例)
  • [七、配置 Gitolite 管理员](#七、配置 Gitolite 管理员)
    • [7.1 指定 Gitolite 管理员](#7.1 指定 Gitolite 管理员)
    • [7.2 操作示范](#7.2 操作示范)
    • [7.3 仓库说明](#7.3 仓库说明)
  • [八、管理员克隆 gitolite-admin仓库](#八、管理员克隆 gitolite-admin仓库)
    • [8.1 克隆管理员仓库](#8.1 克隆管理员仓库)
    • 8.2操作示例
    • [8.3 目录说明](#8.3 目录说明)
  • [九、 避坑指南 ⚠️](#九、 避坑指南 ⚠️)
    • 9.1、公钥权限不对导致Gitolite识别失败
    • [9.2 修改私钥名称导致需要输入密码](#9.2 修改私钥名称导致需要输入密码)
    • [9.3 跨用户拷贝公钥后权限未修改](#9.3 跨用户拷贝公钥后权限未修改)
    • [9.4 公私钥不配对](#9.4 公私钥不配对)
  • [十、💡 小课堂](#十、💡 小课堂)
  • [十一、💻 编程冷笑话](#十一、💻 编程冷笑话)
  • [十二、✨ 今日金句](#十二、✨ 今日金句)

【ubuntu】 安装配置 gitolite 管理 超详细 Git仓库权限管理玩得溜!持续更新

  • 作为一名踩过无数坑的一线运维,我太懂那种痛了------团队里Git仓库权限乱成麻
  • 张三能随便提交核心代码,李四想拉取测试仓库却没权限
  • 每天不是在改authorized_keys,就是在处理权限投诉。
  • 直到我把Gitolite用明白,才算彻底解放双手!
  • 今天就把这套Ubuntu20 Server上配置Gitolite的完整流程掏出来,还加了大家常问的"更换管理员"实操,
  • 新手也能跟着抄作业,从此仓库权限管理躺平~

一、Gitolite 介绍

1.1 为啥非要用Gitolite?🤔

先问大家一个灵魂问题:你还在手动修改~/.ssh/authorized_keys来管控Git仓库权限吗?

手动改的痛点简直不要太明显:

  • 权限粒度粗:要么能访问所有仓库,要么都不能,没法精细到"某用户只能读仓库A,能写仓库B";
  • 易出错:多个人改同一个文件,一不小心就删错行,全团队都没法用;
  • 难维护:团队人数多了,谁有什么权限全靠记

而Gitolite就像给Git仓库配了个智能保安:

  • 权限粒度细:能精确到"用户/组 + 仓库 + 读/写/管理";
  • 配置简单:所有权限写在一个配置文件里,版本化管理,改完提交就生效;
  • 轻量无依赖:不用装数据库、不用搭Web服务,SSH就能玩,低配服务器也能跑;

1.2 Gitolite核心原理 🧠

  • 先给新手兄弟们把原理讲透,不用怕,我用大白话+比喻说清楚:

  • Gitolite本质是一套Git钩子脚本 + SSH权限管控 的组合拳,工作逻辑就像小区管理
  1. 你(用户)想进小区(服务器),得先刷门禁卡(SSH公钥);
  2. 保安(Gitolite)先核对你的门禁卡是不是登记过(公钥是否在Gitolite配置里);
  3. 再看你要进哪个单元(仓库)、想干嘛(读/写),对照权限表(gitolite.conf);
  4. 有权限就放行,没权限直接拦在门外,还会告诉你为啥不让进;

公钥无效
公钥有效
权限不足
权限通过
用户发起Git操作(git clone/pull/push)
通过SSH连接服务器
Gitolite钩子脚本拦截请求
校验用户公钥有效性
返回'公钥未授权'错误
读取gitolite.conf权限配置
校验用户对目标仓库的操作权限
返回'权限拒绝'错误
执行Git原生操作(拉取/推送代码)

1.3 总结

  1. Gitolite是轻量的Git仓库权限管理工具,适合小型团队/低配服务器,对比GitLab更易部署、更省资源;

1.3 Gitolite vs 同类工具

  • 很多兄弟会问:GitLab不也能管权限吗?为啥选Gitolite?先看一张表,把优缺点摆明白:
工具 部署复杂度 资源占用 权限粒度 适用场景 核心优势
Gitolite 极低(5分钟部署) 几乎无(仅占用少量磁盘) 极细(用户/组/仓库/分支级) 小型团队、私有仓库、低配服务器 轻量、免维护、配置简单
GitLab 高(需装数据库/Redis/Nginx等) 高(至少2核4G起步) 细(用户/组/仓库/分支级) 中大型团队、需要Web界面/CI/CD 功能全、可视化、生态完善
Gerrit 中高(需Java环境,配置复杂) 中(1核2G可跑) 极致细(提交级审核) 严格代码审核的团队 代码评审、权限管控极致

总结:如果你的需求只是简单的仓库权限管控,不想折腾复杂部署,Gitolite就是最优解;如果需要Web界面、CI/CD等一站式功能,再考虑GitLab。


二、环境准备 🛠️

  • 先确认咱们的基础环境:
  • 服务器系统:Ubuntu20.04 Server(无桌面版)
  • 核心前提:创建一个专门的系统用户git(注意!不是Git工具,是用来存放SDK管理的用户)
  • 依赖检查:确保服务器已安装git(执行git --version,没有就装apt install git -y

三、安装 Gitolite

  • 【git】用户操作
  • 【git】用户操作
  • 【git】用户操作

3.1 下载Gitolite

  • 第一步先把Gitolite的安装包搞下来
  • 我习惯把软件包统一放software_file目录,方便管理:
  • 创建存放安装包的目录
bash 复制代码
mkdir -p $HOME/software_file
  • 进入目录
bash 复制代码
cd $software_file
  • 克隆Gitolite源码(官方仓库,稳定可靠)
bash 复制代码
git clone https://github.com/sitaramc/gitolite.git

3.2 安装Gitolite

  • 然后创建安装目录
bash 复制代码
mkdir -p $HOME/software/gitolite 
  • 把Gitolite装进去:执行安装命令(-to指定安装路径)
bash 复制代码
~/software_file/gitolite/install -to $HOME/software/gitolite

3.3 操作示例

  • 贴一下我实际操作的输出,兄弟们可以对照看,避免踩坑:
shell 复制代码
git@ubuntu-20:~$ mkdir -p $HOME/software_file
git@ubuntu-20:~$ cd software_file
git@ubuntu-20:~/software_file$ git clone https://github.com/sitaramc/gitolite.git
Cloning into 'gitolite'...
remote: Enumerating objects: 9791, done.
remote: Counting objects: 100% (85/85), done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 9791 (delta 24), reused 58 (delta 17), pack-reused 9706
Receiving objects: 100% (9791/9791), 3.09 MiB | 150.00 KiB/s, done.
Resolving deltas: 100% (6050/6050), done.
git@ubuntu-20:~/software_file$ mkdir -p $HOME/software/gitolite
git@ubuntu-20:~/software_file$ ~/software_file/gitolite/install -to $HOME/software/gitolite
git@ubuntu-20:~/software_file$ pwd
/home/git/software_file
git@ubuntu-20:~/software_file$ ls
gitolite

四、生成git用户的公私钥

  • 【git】用户操作
  • 【git】用户操作
  • 【git】用户操作
  • 注意!这里git用户的公私钥 目前没用 只是要他自动生成的 .ssh 目录
  • 注意!这里git用户的公私钥 目前没用 只是要他自动生成的 .ssh 目录
  • 注意!这里git用户的公私钥 目前没用 只是要他自动生成的 .ssh 目录

4.1 生成Git用户的公私钥

  • 这一步的核心目的是自动生成git用户目录下的.ssh目录(后续存放公钥用)
  • 千万不要设置密码! 一直回车就行,设了密码后续操作会频繁弹密码框,巨麻烦;
  • 私钥名称不要改(默认id_rsa),改了会导致后续Git操作需要手动指定私钥,多此一举;
  • 生成RSA公私钥,-C是备注(邮箱),方便识别
bash 复制代码
ssh-keygen -t rsa -C "git@example.com"
  • 进入.ssh目录
bash 复制代码
cd ~/.ssh
  • 把公钥改名(方便管理,统一命名规范)
bash 复制代码
mv id_rsa.pub git_id_rsa.pub

4.2 操作示范

shell 复制代码
git@ubuntu-20:~/software_file$ ssh-keygen -t rsa -C "git@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/git/.ssh/id_rsa):
Created directory '/home/git/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/git/.ssh/id_rsa
Your public key has been saved in /home/git/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:uYeihf/apPp1jWzmg3wOBEQiPue45Daj6ve4yPK95cw git@example.com
The key's randomart image is:
+---[RSA 3072]----+
|  . ..o          |
| . . o           |
|  o . .          |
|   =   . .       |
|  o .   S        |
| o . . . + o     |
|  * . +.*.B .    |
|oo.=.O *oBo      |
|*=ooB=Eoooo.     |
+----[SHA256]-----+
git@ubuntu-20:~/software_file$ cd ~/.ssh
git@ubuntu-20:~/.ssh$ mv id_rsa.pub git_id_rsa.pub
git@ubuntu-20:~/.ssh$ ls
git_id_rsa.pub id_rsa

五、生成管理员的公私钥

  • 【qiuwenxiong】用户操作
  • 【qiuwenxiong】用户操作
  • 【qiuwenxiong】用户操作
  • 我这里要把qiuwenxiong用户设为 Gitolite 的初始管理员
  • 所以要用到qiuwenxiong的公私钥

5.1 生成 qiuwenxiong 的key

  • 生成公私钥,备注邮箱规范
bash 复制代码
ssh-keygen -t rsa -C "qiuwenxiong@example.com"
  • 进入.ssh目录
bash 复制代码
cd ~/.ssh
  • 公钥改名(统一规范)
bash 复制代码
mv id_rsa.pub qiuwenxiong_id_rsa.pub

5.2 操作示例

shell 复制代码
qiuwenxiong@ubuntu-20:~$ ssh-keygen -t rsa -C "qiuwenxiong@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/qiuwenxiong/.ssh/id_rsa):
Created directory '/home/qiuwenxiong/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/qiuwenxiong/.ssh/id_rsa
Your public key has been saved in /home/qiuwenxiong/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:AkSf+2qJoiNo0kMDhaF1MPPwE9JFN3UxjoWTik6e9XU qiuwenxiong@example.com
The key's randomart image is:
+---[RSA 3072]----+
|.oB+=oo o..o=.   |
|o..X.o o .+= .   |
|..  = o. ....    |
|.    oo.o   . E  |
| .   +ooS. . .   |
|  o   +o  .      |
|.o . . ..        |
|=.+ . o.         |
|=o o ..          |
+----[SHA256]-----+
qiuwenxiong@ubuntu-20:~$ cd .ssh/
qiuwenxiong@ubuntu-20:~/.ssh$ mv id_rsa.pub qiuwenxiong_id_rsa.pub
qiuwenxiong@ubuntu-20:~/.ssh$ ls
id_rsa  qiuwenxiong_id_rsa.pub

六、拷贝管理员公钥到git

  • 【root】用户操作
  • 【root】用户操作
  • 【root】用户操作

6.1 拷贝管理员 qiwuenxiong 公钥 到 git

  • 拷贝 qiuwenxiong 的公钥到git用户的.ssh目录
bash 复制代码
cp /home/qiuwenxiong/.ssh/qiuwenxiong_id_rsa.pub /home/git/.ssh/
  • 进入git用户的.ssh目录
bash 复制代码
cd /home/git/.ssh/
  • 修改公钥的所属用户和组(必须!否则Gitolite识别不了)
bash 复制代码
chown git:git qiuwenxiong_id_rsa.pub

6.2 操作示例

shell 复制代码
root@ubuntu-20:~# cp /home/qiuwenxiong/.ssh/qiuwenxiong_id_rsa.pub /home/git/.ssh/
root@ubuntu-20:~# cd /home/git/.ssh/
root@ubuntu-20:/home/git/.ssh# ls -al
total 20
drwx------ 2 git  git  4096 Jun 27 09:59 .
drwxr-xr-x 6 git  git  4096 Jun 27 09:41 ..
-rw-r--r-- 1 git  git   570 Jun 27 09:41 git.pub
-rw------- 1 git  git  2602 Jun 27 09:41 id_rsa
-rw-r--r-- 1 root root  579 Jun 27 09:59 qiuwenxiong_id_rsa.pub
root@ubuntu-20:/home/git/.ssh# chown git:git qiuwenxiong_id_rsa.pub
root@ubuntu-20:/home/git/.ssh# ls -al
total 20
drwx------ 2 git git 4096 Jun 27 09:59 .
drwxr-xr-x 6 git git 4096 Jun 27 09:41 ..
-rw-r--r-- 1 git git  570 Jun 27 09:41 git.pub
-rw------- 1 git git 2602 Jun 27 09:41 id_rsa
-rw-r--r-- 1 git git  579 Jun 27 09:59 qiuwenxiong_id_rsa.pub

七、配置 Gitolite 管理员

  • 【git】用户操作
  • 【git】用户操作
  • 【git】用户操作
  • 执行Gitolite初始化命令(必须回到git用户根目录执行

7.1 指定 Gitolite 管理员

  • 执行初始化,-pk指定管理员公钥
bash 复制代码
$HOME/software/gitolite/gitolite setup -pk .ssh/qiuwenxiong_id_rsa.pub

7.2 操作示范

shell 复制代码
git@ubuntu-20:~$ $HOME/software/gitolite/gitolite setup -pk .ssh/qiuwenxiong_id_rsa.pub
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git/repositories/testing.git/
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
    (this is normal on a brand new install)

7.3 仓库说明

  • 执行完这步,Gitolite会自动创建两个仓库:
  • gitolite-admin.git:核心!权限配置仓库,后续所有权限修改都靠它;
  • testing.git:测试仓库,用来验证权限是否生效;

八、管理员克隆 gitolite-admin仓库

  • 【qiuwenxiong】用户操作
  • 【qiuwenxiong】用户操作
  • 【qiuwenxiong】用户操作
  • 切换回qiuwenxiong用户,克隆gitolite-admin仓库

8.1 克隆管理员仓库


  • 克隆管理员仓库(替换成你的服务器IP)
bash 复制代码
git clone ssh://git@172.28.17.230/gitolite-admin.git

8.2操作示例

shell 复制代码
qiuwenxiong@ubuntu-20:~$ git clone ssh://git@172.28.17.230/gitolite-admin.git
Cloning into 'gitolite-admin'...
The authenticity of host '172.28.17.230 (172.28.17.230)' can't be established.
ECDSA key fingerprint is SHA256:9qAkotNOQYjaqSYBMQ9zooNOwZNDL0Yr0WmaZICbNDo.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.28.17.230' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.

8.3 目录说明

  • 克隆完成后,gitolite-admin目录里有两个核心文件:
  • conf/gitolite.conf:权限配置文件(重点!);
  • keydir/:存放所有用户的公钥(新用户要加权限,先把公钥放这里);
  • 到这里,初始管理员配置完成!所有仓库都存在git用户的/home/git/repositories目录下:
  • 以后 通过 gitolite-admin 创建的仓库 都是基于/home/git/repositories目录下
bash 复制代码
git@ubuntu-20:~/repositories$ pwd
/home/git/repositories
git@ubuntu-20:~/repositories$ ls
gitolite-admin.git  testing.git

九、 避坑指南 ⚠️

  • 这部分是我踩过的坑,兄弟们直接抄作业就行:

9.1、公钥权限不对导致Gitolite识别失败

  • 现象:克隆仓库时报"Permission denied (publickey)";
  • 原因:git用户.ssh目录权限不是700,或公钥文件权限不是644
  • 解决方案:
bash 复制代码
# 修复.ssh目录权限
chmod 700 /home/git/.ssh
# 修复公钥文件权限
chmod 644 /home/git/.ssh/*.pub

9.2 修改私钥名称导致需要输入密码

  • 现象:每次Git操作都弹"Enter passphrase for key";

  • 原因:私钥改名后,SSH默认找不到,需要手动指定;

  • 解决方案:要么改回默认名id_rsa,要么在~/.ssh/config里配置:

    bash 复制代码
    # 编辑config文件
    vi ~/.ssh/config
    # 添加以下内容(替换成你的私钥路径)
    Host 172.28.17.230
      IdentityFile ~/.ssh/你的私钥名

9.3 跨用户拷贝公钥后权限未修改

  • 现象:Gitolite初始化时报"Permission denied";
  • 原因:公钥文件所属用户/组不是git:git
  • 解决方案:执行chown git:git /home/git/.ssh/qiuwenxiong.pub

9.4 公私钥不配对

  • 现象:SSH连接时报"Load key "xxx": invalid format";
  • 原因:只拷贝了公钥,没拷贝对应的私钥,或拷贝错了;
  • 解决方案:确保公私钥是一对(生成时在同一个目录,没改过名),重新拷贝完整的公私钥。

十、💡 小课堂

  • 如果团队人数多,一个个配权限太麻烦,可以在gitolite.conf里分组:
conf 复制代码
# 定义开发组
@dev = user1 user2 qiuwenxiong
# 定义测试组
@test = user3 user4

# 给dev组配置仓库权限
repo project-dev
    RW+ = @dev  # 读/写/强制推送
    R   = @test # 仅读

# 给test组配置测试仓库权限
repo project-test
    RW+ = @test
    R   = @dev
  • 修改后提交gitolite-admin仓库,权限自动生效,不用重启任何服务!

十一、💻 编程冷笑话

  • 问:Gitolite最崩溃的瞬间是什么?
  • 答:管理员把自己的公钥从keydir里删了,结果自己都没法改权限,只能登服务器手动恢复~
  • 补充版:更换管理员时忘删旧管理员的公钥,旧管理员离职后还能改权限,新管理员直接懵圈!

十二、✨ 今日金句

  • "权限管理不是限制,而是保护------保护代码不被误操作,保护团队不被权限混乱拖慢节奏。管理员更换不是形式,而是安全底线,离职人员的权限必须第一时间回收!"
相关推荐
尤老师FPGA8 小时前
petalinux修改设备树添加vdma生成linux系统
android·linux·运维
月山知了8 小时前
linux kernel component子系统:基于rk3588 Android 14 kernel-6.1 display-subsystem代码分析
android·linux·运维
_Emma_8 小时前
【QCOM】 Linux下qcom venus 编解码驱动框架分析
linux·驱动开发·视频编解码
不才小强9 小时前
Linux系统常用命令
linux·运维·网络
SPC的存折10 小时前
8、Ansible之Playbook---Roles
linux·服务器·ansible
Kira Skyler10 小时前
BPF KPROBE编程中的ctx是什么?
linux
arron889911 小时前
RK3588 Ubuntu 22.04 静态 IP 真实配置文件位置 + 最稳修改方法
tcp/ip·ubuntu·php
三万棵雪松12 小时前
【Linux 物联网网关主控系统-Linux主控部分(三)】
linux·物联网·嵌入式linux
萝卜白菜。12 小时前
TongWeb7.0 集中管理heimdall配置文件说明
linux·运维·服务器
IMPYLH12 小时前
Linux 的 install 命令
linux·运维·服务器·bash