Linux_Ubuntu系统搭建Git服务器教程

2019年07月05日 99 字 教程整理


本文记录在私有服务器搭建远程Git仓库的主要过程。

0.1. Git的安装与配置

0.1.1. Git的下载与安装

apt-get update
#安装 ssh
apt-get install openssh-server
#安装 Git
sudo apt-get install git

此时,Git已在服务器本机安装成功。输入git --version命令即可查看Git版本:

0.1.2. 创建Git用户

sudo adduser git

0.1.3. 创建证书登录

收集所有需要登录的当前服务器用户主机的id_rsa.pub文件,将所有公钥导入至服务器/home/git/.ssh/authorized_keys文件中。

0.1.4. 初始化Git仓库

此时Git已经安装成功,先选定一个目录作为Git仓库,即可创建一个新的Git仓库。
基础命令为: sudo git init --bare <仓库名称>
Git仓库通常以.git结尾。

如:
我们选定/srv/git_repositories/目录作为Git仓库的所在位置,我们需要进入/srv/git_repositories/目录下,输入如下命令创建一个名为vspnoa_v2.6.git的仓库:

sudo git init --bare vspnoa_v2.6.git

当前命令下,Git就会创建一个名为vspnoa_v2.6.git的裸仓库。后续使用正确的方式连接,即可对仓库进行push/pull/fetch等操作。

0.1.5. Git用户授权及登录方式设置

0.1.5.1. 更改Git仓库owner至Git用户

裸仓库没有工作区,因为服务器上的Git仓库通常是为了支持共享,所以通常不会允许用户直接登录到服务器上手动修改工作区。因此,这里建议把仓库的owner设置为git:

sudo chown -R git:git vspnoa_v2.6.git

0.1.5.2. Git用户禁用Shell方式登录

Git用户通常以SSH连接方式使用Git而无需对系统其它位置进行维护。
因此,出于系统安全考虑,可以不允许Git用户登录Shell。

如需禁用Git用户的Shell方式登录,可以打开/etc/passwd文件,找到类似下面的一行的配置代码:

git:x:1001:1001:,,,:/home/git:/bin/bash

/bin/bash改为/usr/bin/git-shell:

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

这样设置,Git用户可以正常通过SSH使用Git,但无法登录Shell,因为我们在这一步已经设置Git用户的git-shell每次一登录就自动退出。

0.1.6. Git仓库的连接与使用

此时,系统的Git仓库已能够正常使用。
在Linux服务器搭建的远程Git仓库通常以SSH方式连接,仓库的Location通常为如下格式:

<Git用户名>@<server_ip>:<Git仓库所在绝对路径>

如:

git@118.89.106.215:/srv/git_repositories/vspnoa_v2.6.git

git_oa_dev001@106.15.226.150:/srv/vspnoa.git

假设我们需要clonevspnoa_v2.6.git这个仓库到另一个位置,过程如下:
首先进入clone项目代码即将储存的位置,如: /srv/git_clones/:
进入上述路径下,执行git-clone命令即可,并根据系统提示输入Git用户的密码即可:

cd /srv/git_clones/
git clone git@118.89.106.215:/srv/git_repositories/vspnoa_v2.6.git

0.2. Git公钥与权限的管理

如果开发团队很小,将每个人的PC公钥收集起来添加到服务器的/home/git/.ssh/authorized_keys文件中即可。
如果团队有人数较多且代码保密级别较高,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。此时则需借助Gitosis/Gitolite等工具达到完善的权限控制目的。
因为Git本是为Linux源代码托管而开发的,所以原生的Git并不支持权限控制。但Git支持钩子(hook),所以可以在服务器端编写一系列脚本来控制提交等操作,以达到权限控制的目的。上述的Gitosis/Gitolite等工具也基本是基于这个原理。

在Git服务管理工具这个领域,主要有三种流行的方案:

工具项目体量认证方式控制级别适用项目备注
Gitosis轻量级,开源SSH公钥库级权限控制方便管理公钥的中小型项目项目已经停止开发,不再维护
Gitolite轻量级,开源SSH公钥分支级权限控制类似于SVN权限级别的中大型项目
Git + Repo + Gerrit超级重量级SSH公钥集版本控制,库管理和代码审核为一身大型及超大型项目Android平台使用的是 Git + Repo + Gerrit方案

对于个人、中小型企业及一些开源项目而言,如果没有特殊的要求,没有必要去架设上面第三种方案Git服务器。通常Gitolite提供的服务已经足够。