凌峰创科服务平台

Linux如何创建Git服务器?

在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.pubkey2.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

仓库维护与备份

定期备份是保障数据安全的重要措施,可以通过rsynctar命令备份仓库:

# 创建备份目录
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 -

常见问题处理

  1. 权限拒绝问题:检查~/.ssh/authorized_keys文件权限是否为600,目录权限是否为700。
  2. 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中为不同用户分配不同仓库的读写权限,确保用户只能操作被授权的仓库。

分享:
扫描分享到社交APP
上一篇
下一篇