我们将使用 Gitosis 来管理用户和仓库,这是一种轻量级、基于 SSH 的解决方案,非常适合小团队或个人项目。

方案概述
- 服务器端 (CentOS):
- 安装 Git 和相关工具。
- 创建一个专用的
git用户来运行 Git 服务。 - 安装并配置 Gitosis,它将通过管理一个特殊的
gitosis-admin仓库来控制所有其他仓库的访问权限。
- 客户端 (您的开发机器):
- 生成 SSH 密钥。
- 克隆
gitosis-admin仓库。 - 通过修改这个仓库的配置文件来添加用户、创建新仓库。
- 将修改后的配置推送到服务器,Gitosis 会自动应用。
第一步:在 CentOS 服务器上安装和配置 Git
更新系统
确保您的系统是最新的。
sudo yum update -y
安装 Git
使用 yum 包管理器安装 Git。
sudo yum install -y git
创建 git 用户
为了安全,我们不应该用 root 用户来运行 Git 服务,创建一个名为 git 的系统用户,并且不允许它登录 shell。
sudo adduser --system --shell /bin/bash --comment 'Git Version Control' --home-dir /home/git git
--system: 创建一个系统用户。--shell /bin/bash: 虽然不登录,但需要/bin/bash来运行 Gitosis 的钩子脚本。--home-dir /home/git: 指定家目录。
设置 git 用户的密码(可选)
如果您需要通过 su 或 sudo 切换到 git 用户,可以设置一个密码,否则,可以跳过。

sudo passwd git
测试 git 用户
切换到 git 用户,并测试 Git 是否可用。
sudo su - git git --version
如果看到 Git 版本号,说明安装成功。
第二步:安装和配置 Gitosis
安装 Gitosis 依赖
Gitosis 需要一些 Python 工具来安装。
# 先退出 git 用户,回到 root 或普通用户 exit # 安装 Python 的 setuptools 和 pip sudo yum install -y python python-setuptools python-pip # 使用 pip 安装 Gitosis sudo pip install gitosis
初始化 Gitosis
在服务器上,我们需要一个“初始”的公钥来配置 Gitosis,这个公钥应该来自您(管理员)的开发机器。

操作流程:
A. 在您的开发机器上,获取您的公钥
打开终端,运行以下命令,它会显示您 ~/.ssh/ 目录下的 id_rsa.pub 文件内容。
# 如果您还没有 SSH 密钥,先生成一个 # ssh-keygen -t rsa -b 4096 cat ~/.ssh/id_rsa.pub
复制输出的完整内容(以 ssh-rsa 开头,以您的邮箱结尾)。
B. 在服务器上,使用该公钥初始化 Gitosis
回到服务器,以 git 用户身份操作。
sudo su - git # 将您刚刚复制的公钥内容粘贴到这里,保存为一个文件,/tmp/admin.pub # 假设公钥内容是:ssh-rsa AAAAB3NzaC1yc2E... admin@example.com echo "ssh-rsa AAAAB3NzaC1yc2E... admin@example.com" > /tmp/admin.pub
使用这个 admin.pub 文件来初始化 Gitosis。
gitosis-init < /tmp/admin.pub
如果成功,你会看到类似 Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/ 的输出,它会自动设置好 gitosis-admin 仓库的 post-update 钩子。
检查初始化结果
Gitosis 会创建一个 repositories 目录来存放所有 Git 仓库。
ls -l ~/repositories/
你应该能看到 gitosis-admin.git 这个仓库。
第三步:在客户端(开发机器)上配置 Gitosis
您需要从您的开发机器上管理 Git 服务器的所有配置。
克隆 gitosis-admin 仓库
这个仓库是 Gitosis 的“控制中心”,您需要将其克隆到本地。
# 退出服务器 git 用户 exit # 在您的开发机器上执行 git clone git@your_server_ip:gitosis-admin.git
your_server_ip: 替换为您的 CentOS 服务器的 IP 地址。- 首次连接时,SSH 会询问您是否信任主机指纹,输入
yes即可。
理解 gitosis-admin 的结构
克隆完成后,进入该目录,你会看到:
cd gitosis-admin ls -l
gitosis.conf: 这是核心配置文件,用于定义用户、仓库和权限。keydir/: 这个目录存放所有用户的公钥,文件名必须是用户的邮箱地址(或唯一标识),内容是对应的公钥。
添加新用户和新仓库(示例)
假设我们要添加一个新用户 developer,并为他创建一个名为 my-new-project 的仓库。
A. 获取新用户的公钥
让 developer 用户在他的机器上执行:
# developer 在他自己的机器上 cat ~/.ssh/id_rsa.pub
他将得到一串公钥,ssh-rsa BBBB... developer@workpc.com。
B. 将公钥添加到服务器
将 developer 的公钥内容添加到服务器的 gitosis-admin 仓库中。
# 回到您的管理机器 cd gitosis-admin # 创建新文件,文件名必须是邮箱地址 # 将 developer 的公钥内容粘贴进去 echo "ssh-rsa BBBB... developer@workpc.com" > keydir/developer@workpc.com
C. 修改 gitosis.conf 文件
打开 gitosis.conf 文件进行编辑。
vim gitosis.conf
一个典型的配置如下:
[gitosis] [group gitosis-admin] writable = gitosis-admin members = admin@example.com # 这里是管理员的邮箱 [group myteam] writable = my-new-project # 定义一个可写仓库 members = admin@example.com # 管理员也是成员 members = developer@workpc.com # 添加新成员 [group readonly-viewers] readonly = my-new-project # 定义一个只读仓库 members = some_other_user@domain.com
[group <group_name>]: 定义一个用户组。writable = <repo_name>: 组内成员对该仓库有读写权限。readonly = <repo_name>: 组内成员对该仓库有只读权限。members = <user_email>: 将用户添加到组中,用户邮箱必须与keydir/目录下的文件名完全一致。
提交更改并推送到服务器**
保存并关闭 gitosis.conf 文件,然后提交您的更改。
git add . git commit -m "Added developer user and created my-new-project" git push origin master
当您 push 成功后,Gitosis 服务器会自动收到更新,并应用新的配置,它会:
- 为
my-new-project创建一个空的 Git 仓库。 - 更新 SSH 的授权文件,允许
developer用户访问。
第四步:用户如何使用新仓库
developer 用户可以从他自己的机器上克隆新仓库了。
# developer 在他自己的机器上 git clone git@your_server_ip:my-new-project.git
如果一切顺利,他就能成功克隆到仓库了。
第五步:日常维护
- 添加更多用户/仓库: 重复 第三步 的流程。
- 删除用户/仓库: 从
gitosis.conf中删除相应条目,并从keydir/中删除对应的公钥文件,commit和push。 - 查看仓库列表: 您可以在服务器的
/home/git/repositories/目录下看到所有已创建的仓库。
安全建议
- 防火墙: 确保服务器的防火墙(如
firewalld或iptables)只开放了必要的端口(SSH 默认 22)。# 使用 firewalld sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
- 禁用密码登录: 为了更高的安全性,可以在服务器的 SSH 配置 (
/etc/ssh/sshd_config) 中禁用密码登录,强制使用 SSH 密钥。- 找到
PasswordAuthentication yes,将其改为PasswordAuthentication no。 - 重启 SSH 服务:
sudo systemctl restart sshd。
- 找到
- 定期更新: 定期运行
sudo yum update -y来保持系统和软件包的最新状态。
常见问题排查
Permission denied (publickey).:- 检查客户端的
~/.ssh/id_rsa.pub是否正确添加到服务器的gitosis-admin/keydir/目录下。 - 检查
gitosis.conf中members字段的邮箱是否与keydir中的文件名完全匹配。 - 检查用户是否属于正确的
group,并且该组是否有对应仓库的writable或readonly权限。
- 检查客户端的
fatal: The remote end hung up unexpectedly:- 通常是
gitosis.conf文件格式错误(例如拼写错误、缺少引号等),仔细检查文件语法。
- 通常是
gitosis: command not found:- 这通常发生在服务器端,确保您在
git用户下操作,或者使用sudo -u git来执行命令。
- 这通常发生在服务器端,确保您在
通过以上步骤,您就拥有了一个功能完善、易于管理的 Git 服务器,Gitosis 的核心思想就是“通过 Git 来管理 Git”,非常优雅和高效。
