本文记录在私有服务器搭建远程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
提供的服务已经足够。