在Linux环境下搭建Git服务器是许多开发团队和个人的常见需求,通过自建Git服务器可以实现代码的集中管理、权限控制以及数据安全,以下是详细的搭建步骤和配置方法,涵盖从环境准备到服务启用的完整流程。
环境准备
首先需要一台Linux服务器,推荐使用Ubuntu或CentOS等主流发行版,确保服务器已安装Git和OpenSSH服务,这些通常可以通过包管理器直接安装,以Ubuntu为例,执行以下命令更新系统并安装必要软件:
sudo apt update && sudo apt upgrade -y sudo apt install git openssh-server -y
安装完成后,检查Git和SSH服务的版本:
git --version ssh -V
创建Git专用用户
为了安全起见,建议创建一个独立的系统用户用于管理Git仓库,避免使用root用户,执行以下命令创建用户并设置密码:
sudo adduser git
根据提示设置密码和用户信息,之后切换到git用户:
su - git
初始化Git仓库
在git用户的家目录下创建一个repositories文件夹,用于存放所有Git仓库,初始化一个裸仓库(裸仓库不包含工作目录,仅用于代码存储和推送):
mkdir -p ~/repositories cd ~/repositories git init --bare project.git
裸仓库的命名通常以.git便于识别,初始化完成后,可以通过git status命令检查仓库状态。
配置SSH免密访问
为了让用户能够通过SSH协议访问Git服务器,需要将用户的公钥添加到服务器的authorized_keys文件中,在git用户的家目录下创建.ssh文件夹并设置权限:
mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
然后将客户端用户的公钥(通常位于~/.ssh/id_rsa.pub追加到authorized_keys文件中,若客户端公钥为ssh-rsa AAAAB3NzaC1yc2E... user@local,则执行:
echo "ssh-rsa AAAAB3NzaC1yc2E... user@local" >> ~/.ssh/authorized_keys
为增强安全性,可以禁用git用户的shell登录,编辑/etc/passwd文件,将最后一行修改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样git用户只能通过Git命令操作仓库,无法直接登录服务器。
设置仓库所有权
确保Git仓库的所有者为git用户,避免权限问题:
sudo chown -R git:git /home/git/repositories
防火墙配置
如果服务器启用了防火墙,需要开放SSH默认端口22,以Ubuntu的UFW为例:
sudo ufw allow 22/tcp sudo ufw reload
对于CentOS系统,使用firewalld:
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
客户端连接测试
在客户端机器上,通过SSH命令测试是否可以访问Git仓库:
ssh git@服务器IP
如果配置正确,会显示"Welcome to Git, your name"等提示信息(取决于git-shell的配置),克隆仓库到本地:
git clone git@服务器IP:/home/git/repositories/project.git
克隆成功后,可以进入项目目录进行代码提交和推送测试。
高级配置:Gitosis或Gitea
如果需要更复杂的权限管理(如多用户、多仓库权限控制),可以考虑使用Gitosis或Gitea等工具,Gitosis通过配置文件管理用户权限,而Gitea则提供了Web界面,支持在线代码审查、Issue跟踪等功能,以Gitea为例,安装步骤如下:
- 下载Gitea二进制文件并放置到
/usr/local/bin目录:wget -O /usr/local/bin/gitea https://dl.gitea.io/gitea/latest/gitea-linux-amd64 chmod +x /usr/local/bin/gitea
- 创建系统用户和配置目录:
sudo adduser --system --group --home /var/lib/gitea git sudo mkdir -p /etc/gitea sudo chown git:git /etc/gitea
- 创建Gitea服务文件并启动:
sudo tee /etc/systemd/system/gitea.service > /dev/null <<EOF [Unit] Description=Gitea After=network.target [Service] User=git Group=git WorkingDirectory=/var/lib/gitea ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini Restart=always [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now gitea
- 访问
http://服务器IP:3000,通过Web界面完成初始配置。
常见问题与注意事项
- 权限问题:确保Git仓库目录的所有者为git用户,且
.ssh目录权限为700,authorized_keys权限为600。 - 防火墙拦截:检查服务器防火墙是否允许SSH端口(默认22)的访问。
- 磁盘空间:定期清理不再使用的Git仓库,避免磁盘空间不足。
- 备份策略:建议定期备份
/home/git/repositories目录,防止数据丢失。
相关问答FAQs
Q1: 如何在Git服务器上创建新仓库?
A1: 以git用户登录服务器,进入~/repositories目录,执行git init --bare 新仓库名.git命令即可创建新的裸仓库,之后用户可以通过git clone git@服务器IP:/home/git/repositories/新仓库名.git克隆仓库。
Q2: 如何限制用户只能访问特定仓库?
A2: 可以通过修改~/.ssh/authorized_keys文件,为每个用户添加命令限制,限制用户user只能访问project仓库,可以在公钥前添加命令前缀:
command="git-shell -c 'git receive-pack '\''/home/git/repositories/project.git'\''" ssh-rsa AAAAB3NzaC1yc2E... user@local
这样该用户只能通过SSH操作指定仓库,无法执行其他命令。
