在Linux系统中创建Git服务器是企业开发环境中常见的需求,本文将详细介绍通过多种方式搭建Git服务器的完整流程,包括使用Git自带的Git协议、SSH协议以及更安全的HTTPS协议,同时涵盖用户权限管理、仓库初始化及日常维护等关键步骤。
环境准备与基础安装
首先需要一台运行Linux系统的服务器(推荐Ubuntu/CentOS),确保系统已更新至最新状态,以Ubuntu为例,执行以下命令更新系统并安装Git:
sudo apt update && sudo apt upgrade -y sudo apt install git -y
安装完成后,验证Git版本:
git --version
接下来创建一个专用用户用于管理Git仓库,避免使用root用户:
sudo adduser git
根据提示设置密码并完成用户创建,然后切换至git用户:
su - git
初始化Git仓库
在git用户的家目录下创建一个repositories文件夹作为仓库存储根目录:
mkdir ~/repositories
初始化一个示例仓库(以project.git为例):
cd ~/repositories git init --bare project.git
--bare参数表示创建一个裸仓库,即没有工作目录的仓库,适合作为服务器端仓库,此时仓库结构如下:
repositories/
└── project.git/
├── branches/
├── config
├── description
├── HEAD
├── hooks/
├── info/
├── objects/
└── refs/
配置SSH协议访问
SSH协议是Git服务器最常用的传输方式之一,配置简单且无需额外安装服务,首先在服务器上为每个开发者创建SSH密钥对(若开发者已有公钥则跳过此步骤,直接收集公钥):
ssh-keygen -t rsa -b 4096 -C "developer@example.com"
将公钥(~/.ssh/id_rsa.pub通过安全方式发送给服务器管理员,服务器管理员将所有公钥追加至git用户的~/.ssh/authorized_keys文件中:
mkdir ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
假设有两个开发者的公钥分别为key1.pub和key2.pub,则执行:
cat key1.pub >> ~/.ssh/authorized_keys cat key2.pub >> ~/.ssh/authorized_keys
开发者即可通过SSH克隆仓库:
git clone git@server_ip:repositories/project.git
配置HTTPS协议访问
若需要通过HTTPS访问,需安装Nginx或Apache作为Web服务器,以Nginx为例:
sudo apt install nginx -y
创建SSL证书(此处使用自签名证书,生产环境需购买权威证书):
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/git.key -out /etc/nginx/ssl/git.crt
配置Nginx,创建/etc/nginx/sites-available/git文件:
server {
listen 443 ssl;
server_name git.example.com;
ssl_certificate /etc/nginx/ssl/git.crt;
ssl_certificate_key /etc/nginx/ssl/git.key;
location / {
root /home/git/repositories;
autoindex on;
dav_ext_methods PROPFIND MKCOL;
}
}
启用配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/git /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl restart nginx
此时可通过https://git.example.com/project.git访问仓库,但需配合用户名密码认证,可使用htpasswd工具创建密码文件:
sudo apt install apache2-utils -y sudo htpasswd -c /etc/nginx/git.passwd gituser
修改Nginx配置,添加认证:
location / {
auth_basic "Git Repository";
auth_basic_user_file /etc/nginx/git.passwd;
...
}
用户权限管理
基于文件系统的权限
通过文件系统权限控制访问是最简单的方式,仅允许gituser访问project.git:
sudo chown -R git:git /home/git/repositories/project.git sudo chmod 700 /home/git/repositories/project.git
使用Gitolite进行精细权限控制
Gitolite是一个强大的Git仓库管理工具,支持基于用户/组的细粒度权限控制,安装步骤如下:
# 在服务器上 git clone https://github.com/sitaramc/gitolite mkdir -p ~/bin gitolite/install -to ~/bin # 初始化Gitolite ~/bin/gitolite setup -pk admin.pub
其中admin.pub是管理员用户的公钥,之后可通过修改~/.gitolite/conf/gitolite.conf文件配置权限,示例:
repo project
RW+ = developer1
R = developer2
仓库维护与备份
定期备份是保障数据安全的重要措施,可以通过rsync或tar命令备份仓库:
# 创建备份目录 mkdir -p ~/backup/git # 使用tar备份 tar -czf ~/backup/git/project_$(date +%Y%m%d).tar.gz -C /home/git/repositories project.git # 设置定时任务(每天凌晨2点备份) echo "0 2 * * * tar -czf ~/backup/git/project_$(date +\%Y\%m\%d).tar.gz -C /home/git/repositories project.git" | crontab -
常见问题处理
- 权限拒绝问题:检查
~/.ssh/authorized_keys文件权限是否为600,目录权限是否为700。 - HTTPS访问报错:确认Nginx配置中SSL证书路径正确,防火墙是否放行443端口。
相关问答FAQs
Q1: 如何限制Git用户的shell权限,使其只能通过Git操作服务器?
A1: 修改/etc/passwd文件中git用户的登录shell为git-shell。
sudo usermod -s /usr/bin/git-shell git
这样git用户只能通过SSH执行Git命令,无法登录系统shell。
Q2: Git服务器如何支持多用户协作且互不影响?
A2: 使用Gitolite工具管理用户和权限,每个用户通过自己的SSH密钥认证,管理员在gitolite.conf中为不同用户分配不同仓库的读写权限,确保用户只能操作被授权的仓库。
