在Ubuntu系统上搭建Git服务器是企业或个人团队进行版本控制管理的常见需求,通过自建Git服务器可以更好地控制代码仓库的访问权限、数据安全性和定制化功能,以下是详细的搭建步骤和配置方法,包括环境准备、服务安装、仓库管理、权限控制及安全加固等内容。

环境准备与基础安装
首先需要一台已安装Ubuntu 20.04或22.04 LTS版本的服务器,确保系统已更新至最新状态,执行以下命令更新系统并安装必要的软件包:
sudo apt update && sudo apt upgrade -y sudo apt install -y git openssh-server
Git是版本控制核心工具,OpenSSH则用于远程访问,安装完成后,创建一个专门的Git管理用户(如gituser),避免使用root用户操作:
sudo adduser gituser
根据提示设置密码,并确认用户信息,随后,切换至gituser身份进行后续操作:
su - gituser
初始化Git仓库与配置
在gituser的家目录下创建一个空仓库目录,并初始化一个裸仓库(bare repository),裸仓库没有工作区,仅包含版本历史信息,适合作为中央仓库:

mkdir -p ~/git-repos cd ~/git-repos git init --bare project.git
project.git即为一个可用的Git仓库,为了方便管理,可以创建一个projects目录来存放多个仓库,并通过符号链接或直接在目录中初始化新仓库。
配置SSH密钥认证
为了安全访问Git仓库,推荐使用SSH密钥认证而非密码,在客户端机器上生成SSH密钥对(如果尚未生成):
ssh-keygen -t ed25519 -C "your_email@example.com"
将公钥(~/.ssh/id_ed25519.pub复制到服务器的gituser用户的~/.ssh/authorized_keys文件中,在服务器端执行以下操作:
mkdir -p ~/.ssh touch ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
然后将客户端的公钥追加到authorized_keys文件中,为确保安全性,可以禁用密码登录,编辑SSH配置文件/etc/ssh/sshd_config,设置:

PasswordAuthentication no PubkeyAuthentication yes
重启SSH服务使配置生效:
sudo systemctl restart sshd
仓库管理与推送测试
在客户端机器上,克隆刚创建的仓库:
git clone gituser@your_server_ip:/home/gituser/git-repos/project.git
进入克隆的仓库目录,创建一个测试文件并提交:
cd project echo "# Test Project" > README.md git add . git commit -m "Initial commit" git push origin main
如果推送成功,说明Git服务器已正常运行,服务器上的project.git仓库会收到客户端提交的代码。
权限控制与用户管理
如果需要为不同用户分配不同仓库的读写权限,可以通过修改authorized_keys文件实现,为用户A创建command限制,使其只能访问特定仓库:
command="git-shell -c 'git receive-pack '\''/home/gituser/git-repos/project.git'\'''" ssh-rsa AAAAB3NzaC1yc2E... user_a@example.com
这样,用户A通过SSH登录后只能执行Git相关命令,无法访问shell,可以结合gitolite工具实现更细粒度的权限管理,该工具支持基于用户/组的读写权限配置。
安全加固建议
- 定期备份:通过
rsync或git bundle命令定期备份仓库数据,防止数据丢失。 - 防火墙配置:仅开放SSH端口(默认22),并使用防火墙限制访问IP:
sudo ufw allow from 192.168.1.0/24 to any port 22 sudo ufw enable
- 日志监控:检查Git操作日志,可通过
git log命令查看提交历史,或结合syslog记录SSH访问日志。
常见问题与解决方案
以下是两个常见问题的解答:
FAQs
-
问题:客户端推送时提示“Permission denied (publickey)”
解答:检查服务器~/.ssh/authorized_keys文件中是否包含正确的公钥,并确保文件权限为600,确认客户端的私钥未被修改或损坏,可通过ssh -T gituser@your_server_ip测试SSH连接是否正常。 -
问题:如何为多个仓库设置不同的管理员权限?
解答:可以使用gitolite工具,它通过~/.gitolite/conf/gitolite.conf文件配置仓库权限,为仓库project1.git分配管理员admin1和admin2:repo project1.git RW+ = admin1 admin2然后运行
gitolite setup更新配置即可实现精细权限控制。
通过以上步骤,即可在Ubuntu系统上搭建一个功能完善、安全可靠的Git服务器,满足团队协作的版本控制需求,根据实际需求,还可以进一步集成Web界面(如GitLab)或持续集成工具,提升开发效率。
