基础裸仓库 方案(最简单)
这是最直接的方式,适合个人使用或小团队,它通过 SSH 访问,利用系统用户来管理权限。

步骤 1: 安装 Git 和 SSH 服务器
确保你的 CentOS 7 系统已经更新,并安装 Git 和 OpenSSH 服务器。
# 更新系统软件包 sudo yum update -y # 安装 Git sudo yum install -y git # 安装 OpenSSH 服务器(通常已安装) sudo yum install -y openssh-server
步骤 2: 创建一个专用的 Git 用户
为了安全和管理方便,我们创建一个不登录的 git 用户来专门管理 Git 仓库。
# 创建 git 用户,并设置其 shell 为 /usr/sbin/nologin 防止登录 sudo useradd -m -s /usr/sbin/nologin git
步骤 3: 创建裸仓库
“裸仓库”是指没有工作目录的仓库,它只包含 Git 的版本历史信息,非常适合作为中央服务器。
我们将在 /home/git 目录下创建一个名为 my-project.git 的仓库。

# 切换到 git 用户 sudo su - git # 创建一个裸仓库 git init --bare my-project.git # 退出 git 用户 exit
你的 Git 仓库已经准备好了,路径是 /home/git/my-project.git。
步骤 4: 在客户端克隆和推送
在任何一个装有 Git 的客户端机器上(你的电脑),你可以进行如下操作。
生成 SSH 密钥(如果还没有) 在你的客户端电脑上,打开终端执行:
# 一路按回车即可,使用默认路径和空密码 ssh-keygen -t rsa -b 4096
将公钥复制到服务器
你需要将客户端生成的公钥(通常是 ~/.ssh/id_rsa.pub)添加到服务器 git 用户的 authorized_keys 文件中。
方法 A:直接在服务器上添加
# 登录到服务器 ssh your_server_ip # 切换到 git 用户 sudo su - git # 创建 .ssh 目录(如果不存在) mkdir -p .ssh chmod 700 .ssh # 将你的公钥内容追加到 authorized_keys 文件中 # (请在你的客户端电脑上执行 'cat ~/.ssh/id_rsa.pub',然后复制粘贴到这里) echo "你的客户端公钥内容" >> .ssh/authorized_keys # 设置正确的权限 chmod 600 .ssh/authorized_keys exit exit
方法 B:使用 ssh-copy-id 命令(更简单)
在你的客户端电脑上直接执行:
# 将你的公钥自动追加到服务器的 git 用户下 ssh-copy-id git@your_server_ip # 它会提示你输入服务器的 root 或 git 用户的密码
在客户端克隆仓库
# 格式: git clone <git_user@server_ip:/path/to/repo.git> git clone git@your_server_ip:/home/git/my-project.git
进行开发并推送
# 进入克隆下来的项目目录 cd my-project # 创建一个新文件并提交 echo "Hello, Git Server!" > README.md git add . git commit -m "Initial commit" # 推送到服务器 git push origin master
你已经成功搭建了一个基础的 Git 服务器。
使用 Gitolite 进行权限管理(推荐)
当团队变大,你需要精细控制每个用户对不同仓库的读写权限(如只读、读写、管理员)时,Gitolite 是一个非常优秀的解决方案,它通过一个特殊的 gitolite 用户和配置文件来管理所有仓库和用户权限。
步骤 1: 安装 Gitolite
在你的 CentOS 7 服务器上安装必要的软件。
# 安装 Git 和 Perl (Gitolite 依赖) sudo yum install -y git perl
步骤 2: 准备管理员
Gitolite 需要一个“管理员”来设置其他用户的权限,这个管理员可以是你自己,也可以是团队中的某个人,这里我们以你(服务器上的 root 用户)为例。
-
在客户端生成 SSH 密钥 在你的客户端电脑上,确保你已经生成了 SSH 密钥对(
id_rsa和id_rsa.pub),如果还没有,请运行ssh-keygen。 -
将管理员的公钥上传到服务器 将你客户端的公钥(
id_rsa.pub)复制到服务器上,并重命名为admin.pub。# 在你的客户端电脑上执行 scp ~/.ssh/id_rsa.pub root@your_server_ip:/tmp/admin.pub
-
在服务器上安装 Gitolite 登录到你的服务器。
# 登录服务器 ssh root@your_server_ip # 创建 gitolite 用户 sudo useradd -m -s /bin/bash gitolite # 将 admin.pub 移动到 gitolite 用户目录下 sudo mv /tmp/admin.pub /home/gitolite/ # 切换到 gitolite 用户 sudo su - gitolite # 克隆并安装 Gitolite git clone git://github.com/sitaramc/gitolite mkdir -p bin gitolite/install -to bin # 确保 ~/bin 在你的 PATH 中 echo 'export PATH=$HOME/bin:$PATH' >> .bashrc source .bashrc # 初始化 Gitolite gl-setup admin.pub
在
gl-setup过程中,它会提示你输入两次gitolite用户的密码,完成后,Gitolite 就安装好了。
步骤 3: 管理仓库和用户
所有的管理操作都通过 Git 本身来完成,你需要将你的客户端电脑的 ~/.ssh/config 配置一下,以便方便地推送配置。
在客户端克隆 Gitolite 的管理仓库 这个仓库包含了所有仓库和用户权限的配置文件。
# 在你的客户端电脑上执行 git clone gitolite@your_server_ip:gitolite-admin
理解 gitolite-admin 仓库结构
克隆下来的 gitolite-admin 仓库有两个关键目录:
keydir/: 存放所有用户的公钥,文件名通常是用户名,内容是对应的公钥。conf/gitolite.conf: 这是核心的权限配置文件。
添加新用户
假设你要添加一个新用户 john。
- 让
john在他的电脑上生成 SSH 密钥,并将他的id_rsa.pub发送给你。 - 将
john.pub文件内容复制到gitolite-admin/keydir/john.pub。 - 提交并推送:
cd gitolite-admin git add keydir/john.pub git commit -m "Add user john" git push
一旦推送,
john就可以立即使用他的私钥访问服务器了。
创建新仓库并设置权限
编辑 conf/gitolite.conf 文件,语法非常直观。
# conf/gitolite.conf
@developers = alice bob john # 定义一个用户组
repo my-project
RW+ = @developers # @developers 组有读写和创建分支的权限
R = jane # jane 只有读权限
repo another-project
RW+ = alice # 只有 alice 有完全控制权
RW+: Read-Write-plus (读写、删除、强制推送)RW: Read-Write (读写)R: Read (只读)
保存文件后,提交并推送:
git add conf/gitolite.conf git commit -m "Create my-project and set permissions" git push
Gitolite 会自动在服务器上创建 my-project.git 和 another-project.git 仓库,并应用你设置的权限。
使用 GitLab(功能最强大)
如果你的需求不仅仅是代码托管,还包括问题跟踪、CI/CD(持续集成/持续部署)、Wiki、代码审查等,那么应该使用 GitLab,GitLab 是一个完整的 DevOps 平台,通常以 Docker 方式部署。
简要步骤
-
安装 Docker 和 Docker Compose
# 安装 Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker 并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 安装 Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
-
下载 GitLab Docker Compose 文件
sudo mkdir -p /srv/gitlab sudo chown -R 1000:1000 /srv/gitlab cd /srv/gitlab sudo curl -O https://gitlab.com/gitlab-org/gitlab/-/raw/master/docker-compose.yml
-
编辑配置 你需要编辑
docker-compose.yml和gitlab.rb(在config目录下,如果不存在可以复制gitlab.rb.example)来设置外部访问的域名、数据持久化路径等。 -
启动 GitLab
sudo docker-compose up -d
首次启动会下载大量镜像并初始化,可能需要较长时间。
-
访问 GitLab 启动后,通过浏览器访问你在配置中设置的域名或 IP 地址,首次登录需要使用 root 用户的密码(密码在
/srv/gitlab/config/initial_root_password文件中,12小时后失效)。
总结与对比
| 特性 | 裸仓库 | Gitolite | GitLab |
|---|---|---|---|
| 易用性 | 非常简单,适合新手 | 需要学习配置语法,但功能强大 | 开箱即用,功能最全 |
| 权限管理 | 基于系统用户,粗糙 | 非常精细,支持用户组和细粒度权限 | 功能强大,支持项目/群组级别的复杂权限 |
| 附加功能 | 无 | 无 | 非常丰富(CI/CD, Wiki, Issue, MR, 仪表盘等) |
| 适用场景 | 个人、小团队、快速原型 | 中小型团队,需要权限控制 | 企业级、大型团队、完整的 DevOps 流程 |
| 资源消耗 | 极低 | 低 | 高(需要较多 CPU 和内存) |
如何选择?
- 如果你只是自己用,或者和两三个非常信任的朋友一起用,方案一(裸仓库)足够了,简单直接。
- 如果你在管理一个小团队,需要对不同的人分配不同的仓库读写权限,方案二(Gitolite)是最佳选择,它轻量、专业且安全。
- 如果你的团队规模较大,或者你需要一个集成了项目管理、CI/CD 等功能的完整平台,不要犹豫,直接使用方案三(GitLab)。
