在Ubuntu系统上搭建Git服务器是一个常见的需求,尤其适合团队协作或个人代码管理,以下是详细的步骤和说明,涵盖环境准备、安装配置、用户管理及安全设置等内容,帮助您完成Git服务器的搭建。

环境准备
确保您的Ubuntu系统已更新至最新版本,并安装了必要的软件包,以Ubuntu 20.04 LTS为例,执行以下命令更新系统:
sudo apt update && sudo apt upgrade -y
然后安装Git和SSH相关工具:
sudo apt install git openssh-server openssh-client -y
安装完成后,检查Git版本:
git --version
确保输出显示Git版本号(如2.25.1),表示安装成功。

创建Git专用用户
为了安全起见,建议创建一个独立的用户用于管理Git仓库,执行以下命令:
sudo adduser git
根据提示设置密码和用户信息,创建完成后,切换至git用户:
sudo su - git
初始化Git仓库
在git用户的主目录下创建一个空仓库作为示例,假设仓库名为project.git:
mkdir project.git && cd project.git git init --bare
--bare参数表示创建一个裸仓库,即没有工作目录的仓库,适合作为服务器端仓库,仓库结构如下:
project.git/
├── branches/
├── config
├── description
├── HEAD
├── hooks/
├── info/
├── objects/
└── refs/
配置SSH访问
SSH是Git推荐的远程访问协议,安全性较高,确保服务器已启用SSH服务:
sudo systemctl status ssh
若未启动,执行sudo systemctl start ssh并设置为开机自启:sudo systemctl enable ssh。
在客户端机器上生成SSH密钥对(若尚未生成):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
按提示生成后,将公钥(~/.ssh/id_rsa.pub添加到服务器的git用户的authorized_keys文件中:
mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
将客户端的公钥内容粘贴到~/.ssh/authorized_keys文件中,每行一个公钥。
测试仓库访问
在客户端机器上,尝试克隆仓库:
git clone git@server_ip:/home/git/project.git
若成功克隆,说明Git服务器基本配置完成。server_ip为服务器的实际IP地址。
用户管理
如果需要添加多个用户,只需将各用户的公钥添加到git用户的authorized_keys文件中即可,为方便管理,可以创建一个git-users组,并将公钥统一存放在/etc/ssh/git_keys文件中,然后修改SSH配置:
- 编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config
- 添加以下内容:
Match User git AuthorizedKeysFile /etc/ssh/git_keys - 重启SSH服务:
sudo systemctl restart sshd
- 将所有用户的公钥追加到
/etc/ssh/git_keys文件中,并设置权限:sudo chmod 644 /etc/ssh/git_keys
仓库权限控制
通过Git的钩子(hooks)可以实现权限控制,限制用户只能推送自己的分支,在project.git/hooks/目录下创建pre-receive文件:
nano project.git/hooks/pre-receive
#!/bin/sh
while read oldrev newrev refname; do
user=$(git log -1 --pretty=format:'%an' $newrev)
if [ "$user" != "$(whoami)" ]; then
echo "Error: You can only push your own changes."
exit 1
fi
done
保存后赋予执行权限:
chmod +x project.git/hooks/pre-receive
备份与恢复
定期备份Git仓库数据是必要的,可以通过rsync工具备份整个/home/git目录:
rsync -avz /home/git/ /backup/git/
恢复时,将备份文件复制回原目录即可:
rsync -avz /backup/git/ /home/git/
常见问题与优化
- 权限问题:确保
git用户对仓库目录有读写权限,可通过chown -R git:git /home/git调整。 - 防火墙配置:若无法访问,检查UFW防火墙规则:
sudo ufw allow ssh sudo ufw allow 9418(若使用Git协议)
相关问答FAQs
问题1:如何为Git仓库添加Web访问界面?
答:可以使用GitWeb或Gogs等工具,以GitWeb为例,安装gitweb包:
sudo apt install gitweb
然后配置/etc/gitweb.conf,设置$projectroot为仓库目录(如/home/git),访问http://server_ip/gitweb即可查看仓库列表。
问题2:如何限制用户只能拉取代码,不能推送?
答:在仓库的pre-receive钩子中添加检查逻辑,以下脚本拒绝所有推送:
#!/bin/sh echo "Pushing is not allowed." exit 1
赋予执行权限后,任何推送操作都会被拒绝,如需特定用户可推送,可在钩子中通过whoami或SSH密钥标识判断用户身份。
