在Ubuntu系统上搭建Git服务器是企业或个人开发中常用的版本控制方案,本文将详细介绍从环境准备到服务器配置、仓库管理及安全设置的完整流程,帮助读者快速构建稳定可靠的Git服务环境。

环境准备与基础安装
首先需要一台安装了Ubuntu Server的计算机,推荐使用20.04 LTS或22.04 LTS版本,确保系统已通过sudo apt update && sudo apt upgrade更新至最新状态,Git服务器的核心组件包括Git软件本身和用于远程访问的SSH服务,通过以下命令完成安装:
sudo apt install git openssh-server -y
安装完成后,检查Git版本确认安装成功:git --version,建议创建一个专门的git用户用于管理仓库,执行sudo adduser git,根据提示设置密码和用户信息,该用户将作为所有Git仓库的所有者。
服务器端仓库初始化
在服务器上选择合适的位置存放Git仓库,通常为/srv/git目录,使用以下命令创建并设置权限:
sudo mkdir -p /srv/git sudo chown git:git /srv/git sudo chmod 755 /srv/git
切换至git用户初始化一个裸仓库(bare repository),裸仓库不包含工作目录,仅用于版本控制:

sudo su - git mkdir myproject.git cd myproject.git git init --bare
裸仓库初始化后会生成hooks、info、objects、refs等关键目录,其中hooks目录用于存放钩子脚本,可实现自动化流程。
SSH免密访问配置
SSH是Git远程访问最安全的方式之一,需要为每个开发者生成SSH密钥对,开发者通过以下命令生成密钥(默认保存在~/.ssh/id_rsa):
ssh-keygen -t rsa -b 4096 -C "developer_email@example.com"
将公钥(~/.ssh/id_rsa.pub通过安全渠道发送给服务器管理员,服务器端需要在git用户的~/.ssh目录下创建authorized_keys文件,将所有开发者的公钥追加到该文件中:
# 在git用户下执行 mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
使用以下命令将公钥内容追加到authorized_keys:

cat /tmp/public_key >> ~/.ssh/authorized_keys
为增强安全性,建议禁用git用户的SSH shell登录,编辑/etc/passwd文件,将最后一行修改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
仓库克隆与推送
开发者可以在本地克隆服务器上的仓库,使用以下格式:
git clone git@server_ip:/srv/git/myproject.git
首次推送需要设置用户信息:
git config --global user.name "Developer Name" git config --global user.email "developer_email@example.com"
在本地仓库中完成文件修改后,通过git push origin main(或master)将代码推送到服务器。
多仓库管理与权限控制
当需要管理多个仓库时,可以在/srv/git目录下创建多个裸仓库,对于权限控制,可以通过以下两种方式实现:
-
文件系统权限:通过修改仓库目录的属主和权限限制访问,
sudo chown git:devgroup /srv/git/repo1.git sudo chmod 770 /srv/git/repo1.git
并将开发者用户添加到
devgroup组。 -
Git钩子:在
/srv/git/repo.git/hooks目录下创建pre-receive脚本,实现更细粒度的权限控制,限制只有特定用户可以推送:#!/bin/bash while read oldrev newrev refname; do if [ "$refname" = "refs/heads/main" ]; then users="user1 user2" current_user=$(whoami) if [[ ! "$users" =~ "$current_user" ]]; then echo "Error: User $current_user has no permission to push to main branch" exit 1 fi fi done赋予该脚本执行权限:
chmod +x pre-receive
备份与维护策略
定期备份Git仓库是保障数据安全的重要措施,可以通过rsync工具实现增量备份:
rsync -avz --delete /srv/git/ /backup/git/
建议设置定时任务(cron),每天凌晨2点自动执行备份:
0 2 * * * rsync -avz /srv/git/ /backup/git/
对于仓库维护,可以定期执行git gc --aggressive优化仓库存储效率,该命令会压缩对象数据库并删除冗余数据。
Web界面集成(可选)
如果需要图形化界面管理仓库,可以安装GitWeb或Gogs,以GitWeb为例:
sudo apt install gitweb
配置文件位于/etc/gitweb.conf,修改$projectroot为仓库路径/srv/git,通过访问http://server_ip/gitweb即可查看仓库列表。
常见问题处理
- 权限拒绝错误:检查
~/.ssh/authorized_keys文件权限是否为600,git用户对仓库目录是否有读写权限。 - 推送失败:确认仓库是否为裸仓库(
.git,检查pre-receive钩子脚本是否有语法错误。
相关问答FAQs
Q1: 如何在Git服务器上创建分支保护策略?
A1: 可以通过Git的pre-receive钩子或使用GitLab/Gogs等平台实现分支保护,在pre-receive钩子中添加以下代码可禁止直接推送至main分支:
#!/bin/bash
while read oldrev newrev refname; do
if [ "$refname" = "refs/heads/main" ]; then
echo "Error: Direct push to main branch is not allowed"
exit 1
fi
done
exit 0
Q2: 如何迁移现有的本地仓库到Ubuntu Git服务器?
A2: 在本地仓库中执行以下命令:
git remote add origin git@server_ip:/srv/git/existing_repo.git git push -u origin --all git push --tags
如果服务器上尚未创建仓库,可先通过git init --bare在服务器创建裸仓库,然后执行上述推送命令,对于非裸仓库,需要先在服务器创建空目录并初始化为裸仓库,再推送分支和标签。
