HOME/git/

git服务器

Article Outline
TOC
Collection Outline

git服务器

市面上有很多的第三方代码托管服务,有名的如github.com,提供了完整的代码托管功能。但是我们有时候需要在组织内部假设git服务器进行代码托管,这部分主要介绍git服务器相关的内容。

协议

git支持四种协议来传输资料,分别是:本地协议(Local)、HTTP(S)协议、SSH(Secure Shell)协议及GIt协议。

本地协议

最基本的协议就是本地协议(Local protocol),其中远程版本库就是硬盘内的一个目录。这种配置常见于组织内部成员都对一个共享目录有访问权限。

这种情况下,本地版本库从远程版本库克隆、推送及拉取文件时,则使用远程版本库的路径作为URL即可,如:

git clone /opt/git/project.git
# 或者使用
git clone file:///opt/git/project.git

两者的区别是,如果不指定file://那么git会尝试使用硬链接或直接复制所需要的文件;如果指定file://,那么git会使用网络传输资料的方式,可能存在传输效率低的问题。

本地协议的优点是:使用简单,可以直接复用已有的文件共享权限和网络访问权限,直接在共享文件系统中放置一个裸版本库,设置好读/写权限即可。

但是这种方式也存在一定的缺点,如:共享文件相对于网络连接访问更难配置,且不方便从多个位置访问,如果需要在组织外部,则无法直接访问到版本仓库。还需要注意的是,共享组的每一个用户都拥有版本仓库的完整权限,无法限制共享组内成员对git内部文件及仓库的修改操作。

HTTP(S)协议

git在使用HTTP协议的时候,有两种通信模式。一种叫做智能HTTP协议,一种叫做哑HTTP协议。

智能HTTP协议

智能HTTP协议的运行方式和SSH及GIt协议类似,只是运行在标准的HTTP端口,并且可以使用各种HTTP验证机制。它支持像git://协议一样的匿名服务,也支持像SSH一样提供传输时的授权和加密。并且,它只需要一个URL就可以做到上述功能。

如果使用github,那么就可以体验智能HTTP协议的实际使用情况。

哑HTTP协议

在哑HTTP协议中,web服务器仅把裸版本库当做普通文件对待,提供文件服务。它的优点是设置起来简单。在实际使用中,如果配置哑HTTP协议,只需要把一个裸版本库放在HTTP目录,设置一个叫做post-update的钩子,然后就可以访问web服务器上的版本库以及克隆版本库。

通常会在智能HTTP服务和简单的哑HTTP服务之间选择一个,极少会混用两者提供服务。

HTTP服务的优点是,不同的访问方式只需要一个URL以及服务器只在授权时提示输入授权信息。相比于SSH协议,可以使用用户名/密码授权是一个很大的优势。缺点就是,架设HTTP协议的服务器会比SSH协议复杂一些,且如果需要在HTTP上使用需要授权的推送,管理凭证相对SSH密钥认证而言更麻烦一些。

SSH协议

使用SSH协议架设git服务器是基于大多数环境已经支持通过SSH访问,并且由于SSH的普遍性,架设和使用都比较容易。

通过SSH协议使用git服务器,使用时需要指定ssh://协议的URL,如:

git clone ssh://user@server/demo.git

也可以使用scp的方式:

git clone user@server:demo.git

不指定用户名的情况,默认使用当前登录的用户。

使用SSH协议的优势在于,架设相对简单,并且SSH协议传输的数据都是经过授权和加密的,安全性有保障。但是也存在无法通过SSH协议进行匿名访问的缺点。

git协议

git协议是包含在git里的一个守护进程,它监听一个特殊端口(9418),其与SSH协议类似,但是无需授权即可访问。如果要开启git协议支持,需要先创建一个git-daemon-export-ok文件。

git协议的优点是,网络传输速度快,目前git协议是git使用的网络传输协议中最快的,git协议与SSH协议拥有相同的数据传输机制,但是没有加密和授权的开销。缺点也很明显,git协议没有授权机制,因此将git协议单独作为访问项目版本库的唯一协议是不可行的。

在服务器上搭建git

这部分简单的说明一下在Linux服务器上搭建git的操作步骤,实际上,你也可以在Mac或者Windows上架设git服务。

首先,服务器上需要安装git,这里不详细说明,可以在发行版的软件仓库进行安装,也可以在git官网下载安装包进行安装。

把裸仓库放在服务器上

首先,我们需要在服务器上创建一个裸仓库,裸仓库的含义就是不包含当前工作区的仓库,其存在的作用完全是为了共享,一般惯例是裸仓库目录以.git结尾,使用--bare选项来创建裸仓库:

git init --bare gitserver.git

现在已经完成了裸仓库的创建,一般我们会将仓库放在/opt/git目录下,我们可以将刚才创建的裸仓库移动到这个目录下,或者在该目录下重新创建一个裸仓库。

这时候,其他用户可以通过SSH服务连接到该服务器,如果他对/opt/git目录有可读权限,那么他就可以克隆刚才创建的仓库:

git clone user@server:/opt/git/gitserver.git

如果该用户还具有/opt/git目录的可写权限,那么他也会拥有自动推送的权限。

我们可以创建一个git账户,并将该账户的权限设置为对/opt/git目录可读写,这时候,一个小组的所有成员均可以通过使用git账户对仓库进行操作。

上述的过程通过SSH协议架设了一个简单的git服务器,对于小型团队而言,一个SSH服务器加上git裸仓库就足够使用了。

待续。