在CentOS 7系统中搭建Git服务器是一个常见的需求,无论是个人项目还是团队协作,自建Git服务器都能提供更好的可控性和安全性,以下是详细的搭建步骤,包括环境准备、安装配置、权限管理及安全优化等内容。

环境准备
首先需要一台安装好CentOS 7系统的服务器,确保系统已更新至最新状态,执行以下命令更新系统并安装必要的依赖包:
sudo yum update -y sudo yum install -y curl policycoreutils-python openssh-server
安装完成后,启动SSH服务并设置开机自启:
sudo systemctl enable sshd sudo systemctl start sshd
为确保服务器时间同步,建议安装NTP服务:
sudo yum install -y ntp sudo systemctl enable ntpd sudo systemctl start ntpd
安装Git
CentOS 7的默认软件仓库中可能包含Git,但版本可能较旧,建议通过EPEL仓库或源码编译安装最新版本,这里以EPEL仓库为例:

sudo yum install -y epel-release sudo yum install -y git
安装完成后,验证Git版本:
git --version
若需升级到最新版本,可通过源码编译安装,步骤如下:
- 安装编译依赖:
sudo yum install -y gcc gettext-devel openssl-devel perl-ExtUtils-MakeMaker xmlto asciidoc
- 下载最新源码包(以Git 2.35.0为例):
cd /usr/local/src wget https://github.com/git/git/archive/v2.35.0.tar.gz tar -xzvf v2.35.0.tar.gz cd git-2.35.0
- 编译并安装:
make configure ./configure --prefix=/usr/local make all sudo make install
创建Git用户和仓库目录
为了安全,建议创建一个专用的Git用户用于管理仓库:
sudo useradd -m -s /bin/bash git sudo passwd git # 设置密码
创建仓库存储目录并设置权限:

sudo mkdir -p /srv/git sudo chown -R git:git /srv/git sudo chmod -R 755 /srv/git
初始化仓库并设置SSH访问
创建空仓库
以创建一个名为project.git的仓库为例:
sudo su - git cd /srv/git git init --bare project.git exit
配置SSH免密登录
在客户端生成SSH密钥(若未生成):
ssh-keygen -t rsa -b 4096
将公钥(~/.ssh/id_rsa.pub添加到服务器的/home/git/.ssh/authorized_keys文件中:
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 sudo sh -c "echo '客户端公钥内容' >> /home/git/.ssh/authorized_keys" sudo chown -R git:git /home/git/.ssh
测试连接
在客户端执行:
ssh git@服务器IP
若无需密码登录成功,则配置正确。
配置Git钩子(可选)
Git钩子可实现自动化操作,如提交前检查代码格式、推送后自动部署等,以下是一个简单的钩子示例:
在/srv/git/project.git/hooks/目录下创建pre-receive文件:
sudo nano /srv/git/project.git/hooks/pre-receive
```拒绝空提交):
```bash
#!/bin/sh
while read oldrev newrev refname; do
if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then
echo "错误:不允许删除分支" >&2
exit 1
fi
done
exit 0
赋予执行权限:
sudo chmod +x /srv/git/project.git/hooks/pre-receive
安全优化
- 禁用Git用户shell登录:编辑
/etc/passwd文件,将Git用户的shell改为/usr/bin/git-shell:sudo usermod -s /usr/bin/git-shell git
- 防火墙配置:允许SSH和Git(若使用HTTP协议):
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
- 定期备份:编写备份脚本,定期备份仓库目录:
#!/bin/bash DATE=$(date +%Y%m%d) tar -czf /backup/git_backup_$DATE.tar.gz /srv/git
通过
crontab设置定时任务(如每天凌晨2点执行):0 2 * * * /path/to/backup_script.sh
多仓库管理与权限控制
若需为不同用户分配不同仓库的权限,可通过以下方式实现:
- 创建用户组:
sudo groupadd dev-team sudo usermod -a -G dev-team user1 sudo usermod -a -G dev-team user2
- 设置仓库组权限:
sudo chown -R git:dev-team /srv/git/project.git sudo chmod -R 770 /srv/git/project.git
- 使用Gitosis或Gogs:对于更复杂的权限管理,可部署Gitosis(基于SSH的权限管理工具)或Gogs(轻量级Git服务Web界面)。
常见问题与解决方案
-
问题:客户端推送时提示
Permission denied (publickey)。
解决:检查服务端/home/git/.ssh/authorized_keys文件权限是否为600,公钥格式是否正确,以及客户端是否正确生成了SSH密钥对。 -
问题:仓库无法创建或推送,提示
fatal: Could not read from remote repository。
解决:检查仓库目录权限(chown -R git:git /srv/git),确保Git用户对目录有读写权限,并验证仓库是否为bare仓库(git init --bare)。
FAQs
问题1:如何为Git仓库设置HTTPS访问?
解答:可通过配置Nginx或Apache反向代理结合SSL证书实现,首先安装Nginx:
sudo yum install -y nginx
然后配置Nginx监听443端口,指向Git仓库目录,并配置SSL证书(可使用Let's Encrypt免费证书),具体配置需结合Git的HTTP backend模块,详细步骤可参考Nginx官方文档。
问题2:如何限制Git用户的磁盘空间?
解答:可通过Linux的磁盘配额功能实现,首先安装quota工具:
sudo yum install -y quota
然后对/srv/git分区启用配额,设置用户或组的空间限制,具体步骤包括:编辑/etc/fstab添加usrquota选项,重新挂载分区,使用edquota命令为Git用户设置软/硬限制(如软限制10GB,硬限制12GB)。
