服务器上的Git
建立一个大家都可以访问的共享仓库,从那里推送和拉取数据。我们将把这个仓库称为“Git 服务器”;代理一个Git 仓库只需要花费很少的资源,几乎从不需要整个服务器来支持它的运行。
架设一个Git 服务器不难。第一步是选择与服务器通讯的协议。
远程仓库通常只是一个纯仓库(bare repository) ——一个没有当前工作目录的仓库。因为该仓库只是一个合作媒介,所以不需要从一个处于已从硬盘上检出状态的快照;仓库里仅仅是Git 的数据。简单的说,纯仓库是你项目里.git 目录的内容,别无他物。
协议
Git 可以使用四种主要的协议来传输数据:本地传输,SSH 协议,Git 协议和HTTP 协议。除了HTTP 协议之外,其他所有协议都要求在服务器端安装并运行Git 。
本地协议
最基础的就是本地协议(Local protocol) 了,远程仓库在该协议中就是硬盘上的另一个目录。这常见于团队每一个成员都对一个共享的文件系统(例如NFS )拥有访问权,抑或比较少见的多人共用同一台电脑的时候。
如果你使用一个共享的文件系统,如果你在URL的开头明确的使用file:// ,那么Git 会以一种略微不同的方式运行。如果你只给出路径,Git 会尝试使用硬链接或者直接复制它需要的文件。如果使用了file:// ,Git会调用它平时通过网络来传输数据的工序,而这种方式的效率相对很低。使用file:// 前缀的主要原因是当你需要一个不包含无关引用或对象的干净仓库副本的时候
——一般是从其他版本控制系统的导入之后或者类似的情形(参见第9章的维护任务)。我们这里使用普通路径,因为通常这样总是更快。
要添加一个本地仓库到现有Git 工程,运行如下命令:
$ git remote add local_proj /opt/git/project.git
优点
基于文件仓库的优点在于它的简单,同时保留了现存文件的权限和网络访问权限。如果你
的团队已经有一个全体共享的文件系统,建立仓库就十分容易了。你只需把一份纯仓库的副
本放在大家能访问的地方,然后像对其他共享目录一样设置读写权限就可以了。
缺点
这种方法的缺点是,与基本的网络连接访问相比,能从不同的位置访问的共享权限难以架
设。另一个很重要的问题是该方法不一定就是最快的,尤其是对于共享挂载的文件系统
SSH 协议
Git 使用的传输协议中最常见的可能就是SSH 了。这是因为大多数环境已经支持通过
SSH 对服务器的访问——即使还没有,也很容易架设。SSH 也是唯一一个同时便于读和写操
作的网络协议。另外两个网络协议(HTTP 和Git)通常都是只读的,执行写操作时还是需要SSH。SSH 同时也是一个验证授权的网络协议;而因为其普遍性,通常也很容易架设和使用。
通过SSH 克隆一个Git 仓库,你可以像下面这样给出ssh:// 的URL:
$ git clone ssh://user@server:project.git
或者不指明某个协议——这时Git 会默认使用SSH :
$ git clone user@server:project.git
也可以不指明用户,Git 会默认使用你当前登录的用户。
优点
使用SSH 的好处有很多。首先,如果你想拥有对网络仓库的写权限,基本上不可能不使
用SSH。其次,SSH 架设相对比较简单—— SSH 守护进程很常见。再次,通过SSH 进行访
问是安全的——所有数据传输都是加密和授权的。最后,类似Git 和本地协议,SSH 很高
效,会在传输之前尽可能的压缩数据。
缺点
SSH 的限制在于你不能通过它实现仓库的匿名访问。即使仅为读取数据,人们也必须在能
通过SSH 访问主机的前提下才能访问仓库,这使得SSH 不利于开源的项目。如果你仅仅在
公司网络里使用,SSH 可能是你唯一需要使用的协议。
Git 协议
个包含在Git 软件包中的特殊守护进程; 它会监听一个提供类似于SSH 服务的特定端口(9418),而无需任何授权。用Git 协议运营仓库,你需要创建git-export-daemon-ok 文件——它是协议进程提供仓库服务的必要条件——但除此之外该服务没有什么安全措施。要么所有人都能克隆Git 仓库,要么谁也不能。这也意味着该协议通常不能用来进行推送。你可以允许推送操作;然而由于没有授权机制,一旦允许该操作,网络上任何一个知道项目URL 的人将都有推送权限。
优点
Git 协议是现存最快的传输协议。如果你在提供一个有很大访问量的公共项目,或者一
个不需要对读操作进行授权的庞大项目,架设一个Git 守护进程来供应仓库是个不错的选
择。它使用与SSH 协议相同的数据传输机制,但省去了加密和授权的开销。
缺点
Git 协议消极的一面是缺少授权机制。用Git 协议作为访问项目的唯一方法通常是不可
取的。一般做法是,同时提供SSH 接口,让几个开发者拥有推送(写)权限,其他人通过
git:// 拥有只读权限。Git 协议可能也是最难架设的协议。它要求有单独的守护进程,需
要定制
HTTP/S 协议
HTTP 或HTTPS 协议的优美之处在于架设的简便性。基本上, 只需要把Git 的纯仓库文件放在HTTP 的文件根目录下,配置一个特定的post-update 挂钩(hook),就搞定了
Git 附带的post-update 挂钩会默认运行合适的命令(git updateserver-info)来确保通过HTTP 的获取和克隆正常工作。这条命令在你用SSH 向仓库推送内容时运行;之后,其他人就可以用下面的命令来克隆仓库:$ git clone http://example.com/gitproject.git
优点
使用HTTP 协议的好处是易于架设。几条必要的命令就可以让全世界读取到仓库的内容。
花费不过几分钟。HTTP 协议不会占用过多服务器资源。因为它一般只用到静态的HTTP 服
务提供所有的数据,普通的Apache 服务器平均每秒能供应数千个文件——哪怕是让一个小
型的服务器超载都很难。
缺点
HTTP 协议的消极面在于,相对来说客户端效率更低。克隆或者下载仓库内容可能会花费
更多时间,而且HTTP 传输的体积和网络开销比其他任何一个协议都大