凌峰创科服务平台

Ubuntu如何搭建Git服务器?

在Ubuntu系统上搭建Git服务器是企业或个人开发中常用的版本控制方案,本文将详细介绍从环境准备到服务器配置、仓库管理及安全设置的完整流程,帮助读者快速构建稳定可靠的Git服务环境。

Ubuntu如何搭建Git服务器?-图1
(图片来源网络,侵删)

环境准备与基础安装

首先需要一台安装了Ubuntu Server的计算机,推荐使用20.04 LTS或22.04 LTS版本,确保系统已通过sudo apt update && sudo apt upgrade更新至最新状态,Git服务器的核心组件包括Git软件本身和用于远程访问的SSH服务,通过以下命令完成安装:

sudo apt install git openssh-server -y

安装完成后,检查Git版本确认安装成功:git --version,建议创建一个专门的git用户用于管理仓库,执行sudo adduser git,根据提示设置密码和用户信息,该用户将作为所有Git仓库的所有者。

服务器端仓库初始化

在服务器上选择合适的位置存放Git仓库,通常为/srv/git目录,使用以下命令创建并设置权限:

sudo mkdir -p /srv/git
sudo chown git:git /srv/git
sudo chmod 755 /srv/git

切换至git用户初始化一个裸仓库(bare repository),裸仓库不包含工作目录,仅用于版本控制:

Ubuntu如何搭建Git服务器?-图2
(图片来源网络,侵删)
sudo su - git
mkdir myproject.git
cd myproject.git
git init --bare

裸仓库初始化后会生成hooksinfoobjectsrefs等关键目录,其中hooks目录用于存放钩子脚本,可实现自动化流程。

SSH免密访问配置

SSH是Git远程访问最安全的方式之一,需要为每个开发者生成SSH密钥对,开发者通过以下命令生成密钥(默认保存在~/.ssh/id_rsa):

ssh-keygen -t rsa -b 4096 -C "developer_email@example.com"

将公钥(~/.ssh/id_rsa.pub通过安全渠道发送给服务器管理员,服务器端需要在git用户的~/.ssh目录下创建authorized_keys文件,将所有开发者的公钥追加到该文件中:

# 在git用户下执行
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

使用以下命令将公钥内容追加到authorized_keys

Ubuntu如何搭建Git服务器?-图3
(图片来源网络,侵删)
cat /tmp/public_key >> ~/.ssh/authorized_keys

为增强安全性,建议禁用git用户的SSH shell登录,编辑/etc/passwd文件,将最后一行修改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

仓库克隆与推送

开发者可以在本地克隆服务器上的仓库,使用以下格式:

git clone git@server_ip:/srv/git/myproject.git

首次推送需要设置用户信息:

git config --global user.name "Developer Name"
git config --global user.email "developer_email@example.com"

在本地仓库中完成文件修改后,通过git push origin main(或master)将代码推送到服务器。

多仓库管理与权限控制

当需要管理多个仓库时,可以在/srv/git目录下创建多个裸仓库,对于权限控制,可以通过以下两种方式实现:

  1. 文件系统权限:通过修改仓库目录的属主和权限限制访问,

    sudo chown git:devgroup /srv/git/repo1.git
    sudo chmod 770 /srv/git/repo1.git

    并将开发者用户添加到devgroup组。

  2. Git钩子:在/srv/git/repo.git/hooks目录下创建pre-receive脚本,实现更细粒度的权限控制,限制只有特定用户可以推送:

    #!/bin/bash
    while read oldrev newrev refname; do
      if [ "$refname" = "refs/heads/main" ]; then
        users="user1 user2"
        current_user=$(whoami)
        if [[ ! "$users" =~ "$current_user" ]]; then
          echo "Error: User $current_user has no permission to push to main branch"
          exit 1
        fi
      fi
    done

    赋予该脚本执行权限:chmod +x pre-receive

备份与维护策略

定期备份Git仓库是保障数据安全的重要措施,可以通过rsync工具实现增量备份:

rsync -avz --delete /srv/git/ /backup/git/

建议设置定时任务(cron),每天凌晨2点自动执行备份:

0 2 * * * rsync -avz /srv/git/ /backup/git/

对于仓库维护,可以定期执行git gc --aggressive优化仓库存储效率,该命令会压缩对象数据库并删除冗余数据。

Web界面集成(可选)

如果需要图形化界面管理仓库,可以安装GitWeb或Gogs,以GitWeb为例:

sudo apt install gitweb

配置文件位于/etc/gitweb.conf,修改$projectroot为仓库路径/srv/git,通过访问http://server_ip/gitweb即可查看仓库列表。

常见问题处理

  1. 权限拒绝错误:检查~/.ssh/authorized_keys文件权限是否为600,git用户对仓库目录是否有读写权限。
  2. 推送失败:确认仓库是否为裸仓库(.git,检查pre-receive钩子脚本是否有语法错误。

相关问答FAQs

Q1: 如何在Git服务器上创建分支保护策略?
A1: 可以通过Git的pre-receive钩子或使用GitLab/Gogs等平台实现分支保护,在pre-receive钩子中添加以下代码可禁止直接推送至main分支:

#!/bin/bash
while read oldrev newrev refname; do
  if [ "$refname" = "refs/heads/main" ]; then
    echo "Error: Direct push to main branch is not allowed"
    exit 1
  fi
done
exit 0

Q2: 如何迁移现有的本地仓库到Ubuntu Git服务器?
A2: 在本地仓库中执行以下命令:

git remote add origin git@server_ip:/srv/git/existing_repo.git
git push -u origin --all
git push --tags

如果服务器上尚未创建仓库,可先通过git init --bare在服务器创建裸仓库,然后执行上述推送命令,对于非裸仓库,需要先在服务器创建空目录并初始化为裸仓库,再推送分支和标签。

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