
- 在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。
- 而在这座秋知叶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权限管控 的组合拳,工作逻辑就像小区管理
- 你(用户)想进小区(服务器),得先刷门禁卡(SSH公钥);
- 保安(Gitolite)先核对你的门禁卡是不是登记过(公钥是否在Gitolite配置里);
- 再看你要进哪个单元(仓库)、想干嘛(读/写),对照权限表(gitolite.conf);
- 有权限就放行,没权限直接拦在门外,还会告诉你为啥不让进;
公钥无效
公钥有效
权限不足
权限通过
用户发起Git操作(git clone/pull/push)
通过SSH连接服务器
Gitolite钩子脚本拦截请求
校验用户公钥有效性
返回'公钥未授权'错误
读取gitolite.conf权限配置
校验用户对目标仓库的操作权限
返回'权限拒绝'错误
执行Git原生操作(拉取/推送代码)
1.3 总结
- 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里删了,结果自己都没法改权限,只能登服务器手动恢复~
- 补充版:更换管理员时忘删旧管理员的公钥,旧管理员离职后还能改权限,新管理员直接懵圈!
十二、✨ 今日金句
- "权限管理不是限制,而是保护------保护代码不被误操作,保护团队不被权限混乱拖慢节奏。管理员更换不是形式,而是安全底线,离职人员的权限必须第一时间回收!"