Linux Git服务器搭建是企业级代码管理的核心环节,通过自建Git服务器可以实现代码的集中管控、权限精细化分配以及数据安全可控,本文将详细讲解在Linux环境下搭建Git服务器的完整流程,包括服务初始化、仓库创建、用户管理、权限控制及安全配置等关键步骤,帮助开发者构建稳定高效的代码托管平台。
环境准备与基础安装
在开始搭建前,需确保Linux系统满足基本要求:推荐使用Ubuntu 20.04+或CentOS 7+系统,内存至少2GB,硬盘空间根据项目规模预留(建议至少50GB),首先更新系统并安装Git及相关依赖工具:
# Ubuntu/Debian系统 sudo apt update && sudo apt install -y git openssh-server # CentOS/RHEL系统 sudo yum update -y && sudo yum install -y git openssh-server
安装完成后验证Git版本:
git --version
建议使用Git 2.0以上版本以获得更好的性能和功能支持,同时确保SSH服务已启动并开机自启:
sudo systemctl start sshd sudo systemctl enable sshd
创建Git专用用户与仓库目录
为安全起见,建议创建独立的Git系统用户,避免使用root用户操作:
sudo useradd -m -s /bin/bash git sudo passwd git # 设置密码(可选,后续主要通过SSH密钥认证)
创建Git仓库的根目录,并设置正确的权限:
sudo mkdir -p /srv/git sudo chown git:git /srv/git sudo chmod 755 /srv/git
初始化 bare 仓库
Git服务器通常使用"bare仓库"(无工作目录)模式,这种仓库仅包含版本历史信息,适合作为中央仓库,创建第一个示例仓库:
sudo -u git git init --bare /srv/git/project.git
参数说明:
--bare:创建裸仓库,不包含工作区-u git:以git用户身份执行,确保权限正确
仓库创建后,目录结构如下:
/srv/git/project.git/
├── branches/ # 分支目录
├── config # 仓库配置文件
├── description # 仓库描述
├── HEAD # 当前分支指针
├── hooks/ # Git钩子脚本目录
├── info/ # 仓库信息目录
├── objects/ # 对象数据库(核心数据)
└── refs/ # 引用目录(标签、分支等)
用户SSH密钥配置
用户通过SSH协议访问Git服务器时,需提前将公钥添加到服务器的authorized_keys文件中,以用户"developer"为例:
- 用户端生成SSH密钥对(若无):
ssh-keygen -t rsa -b 4096 -C "developer@example.com"
- 将公钥(~/.ssh/id_rsa.pub)通过安全通道发送至服务器
- 在服务器端添加公钥:
sudo mkdir -p /home/git/.ssh sudo chmod 700 /home/git/.ssh sudo touch /home/git/.ssh/authorized_keys sudo chmod 600 /home/git/.ssh/authorized_keys # 将用户公钥追加到authorized_keys文件 sudo sh -c "echo 'ssh-rsa AAAAB3NzaC1yc2E...' >> /home/git/.ssh/authorized_keys" sudo chown -R git:git /home/git/.ssh
权限管理与访问控制
基于文件系统的权限
通过操作系统文件权限控制用户访问:
# 允许特定用户读写 sudo chmod -R 770 /srv/git/project.git sudo chown -R git:devgroup /srv/git/project.git # 假设devgroup是开发组
使用Gitolite进行高级权限管理
对于需要精细权限控制的场景,推荐使用Gitolite:
# 安装Gitolite sudo apt install -y gitolite3 # 初始化Gitolite(使用管理员的公钥) sudo -u git gl-setup admin.pub
Gitolite通过~/.gitolite/conf/gitolite.conf配置文件管理仓库和权限:
repo project
RW+ = developer1
RW = developer2
R = guest
Git服务器权限配置对比表
| 配置方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 文件系统权限 | 简单易用,无需额外工具 | 权粒度粗,难以批量管理 | 小型团队,简单权限需求 |
| Gitolite | 细粒度权限,支持分支/标签控制 | 配置较复杂,需学习语法 | 中大型团队,复杂权限模型 |
| GitLab/Gitea | 提供Web界面,支持CI/CD | 资源消耗大,需额外维护 | 需要完整DevOps平台的企业 |
安全加固措施
-
禁用密码登录:编辑SSH配置文件
/etc/ssh/sshd_config,设置:PasswordAuthentication no PubkeyAuthentication yes
重启SSH服务:
sudo systemctl restart sshd -
防火墙配置:仅开放必要端口(默认SSH端口22)
sudo ufw allow 22/tcp sudo ufw enable
-
定期备份:创建备份脚本,定期备份仓库目录:
#!/bin/bash DATE=$(date +%Y%m%d) tar -czf /backup/git-backup-$DATE.tar.gz /srv/git
-
日志审计:监控Git操作日志:
tail -f /var/log/auth.log # SSH登录日志 git log --pretty=format:"%h %an %ad %s" --date=short # 仓库操作历史
客户端使用示例
用户克隆仓库:
git clone git@server:/srv/git/project.git
提交代码:
cd project echo "echo 'Hello Git'" > test.sh git add test.sh git commit -m "Add test script" git push origin main
相关问答FAQs
问题1:如何为Git仓库设置只读权限?
解答:可以通过文件系统权限或Gitolite实现,文件系统方式:sudo chmod -R 755 /srv/git/repo.git(755表示所有者读写,其他用户只读);Gitolite方式在配置文件中使用R权限,如repo test R = user1,对于需要临时只读的情况,也可通过Git钩子(如pre-receive)实现提交拦截。
问题2:Git服务器出现"Permission denied (publickey)"错误如何排查?
解答:按以下步骤排查:1)检查客户端公钥是否正确添加到服务器/home/git/.ssh/authorized_keys;2)确认文件权限:authorized_keys应为600,.ssh目录应为700;3)检查Git用户shell配置:/etc/passwd中Git用户的shell应为/bin/bash而非/usr/sbin/nologin;4)服务器端查看SSH日志:/var/log/auth.log定位具体错误原因;5)客户端使用ssh -vT git@server调试连接过程。
