1.介绍
我们在使用Git进行数据提交或者拉流的时候,有考虑到为什么速度那么快么?或者Git的数据提交是按照什么样的协议呢?
Git有四种不同的协议用来传输资料,分别是:
- 本地协议Local
- HTTP协议
- SSH协议(Secure Shell)
- Git协议
下面就针对这四种协议进行一个介绍。并标注相关的优缺点。
本篇主要是提高大家对于git的一些扩展知识。很多情况下我们单纯使用Git时,并不用在意这些知识,但是我们如果想自己搭建Git服务器,那么这些知识可以说是必不可少的。
2. 协议
2.1 本地协议
本地协议常见的情况就是,远程仓库地址在同一主机上的其他目录。例如NFS文件共享仓库等。我们访问该仓库可以直接通过操作系统的文件管理器进行访问。如果是这样的共享文件系统,我们也可以和使用远程仓库一样,机械能clone克隆,push推送,pull拉取等操作。
示例:
代码语言:javascript复制$ git clone /zinyan/git/project.git
或使用下面的这种
$ git clone file:///zinyan/git/project.git
优点: 基于文件系统的版本仓库的优点就是简单,并且可以直接使用现有的文件权限和网络访问权限。如果团队已经有了共享文件系统,那么建立版本仓库会十分容易。只需要像设置其他文件共享一样。共享项目并设置好读写权限就可以了。
其次就是,访问速度将会十分快速。
缺点: 一般情况下共享文件系统比较难配置,而且往往会出现一些访问错误。最后就是无法外网访问,如果需要外网访问。还需要挂载一个远程磁盘或通过vpn访问。
2.2 HTTP协议
我们主要讨论Git 1.6.6版本后的智能HTTP协议。老版本的Http协议就不做太多讨论了,毕竟现在Git都已经更新到2.35.1了。
智能 HTTP 的运行方式和 SSH 及 Git 协议类似,只是运行在标准的 HTTP/S 端口上并且可以使用各种 HTTP 验 证机制, 这意味着使用起来会比 SSH 协议简单的多,比如可以使用 HTTP 协议的用户名/密码授权,免去设置 SSH 公钥。(我们之后介绍如何设置SSH公钥)
它即支持像 git:// 协议一样设置匿名服务, 也可以像 SSH 协议一样提供传输时的授权和加密。而且只用一个 URL 就可以都做到,省去了为不同的需求设置不同的 URL。如果你要推送到一个需要授权的服务器上(一般来讲都需要),服务器会提示你输入用户名和密码。从 服务器获取数据时也一样。
这也是现在主流提供的https地址
优点 :不同的访问方式只需要一个 URL 以及服务器只在需要授权时提示输入授权信息,这两个简便性让终端用户使用 Git 变得非常简单。相比 SSH 协议,可以使用用户名/密码授权是一个很大的优势,这样用户就不必须在使用 Git 之前先在本地生成 SSH 密钥对再把公钥上传到服务器。对非资深的使用者,或者系统上缺少 SSH 相关程序 的使用者,HTTP 协议的可用性是主要的优势。与 SSH 协议类似,HTTP 协议也非常快和高效。你也可以在 HTTPS 协议上提供只读版本库的服务,如此你在传输数据的时候就可以加密数据;或者,你甚至可 以让客户端使用指定的 SSL 证书。另一个好处是 HTTPS 协议被广泛使用,一般的企业防火墙都会允许这些端口的数据通过。
缺点 在一些服务器上,架设 HTTPS 协议的服务端会比 SSH 协议的棘手一些。除了这一点,用其他协议提供 Git 服务 与智能 HTTP 协议相比就几乎没有优势了。如果你在 HTTP 上使用需授权的推送,管理凭证会比使用 SSH 密钥认证麻烦一些。然而,你可以选择使用凭证 存储工具,比如 macOS 的 Keychain 或者 Windows 的凭证管理器。
2.3 SSH 协议
架设 Git 服务器时常用 SSH 协议作为传输协议。因为大多数环境下服务器已经支持通过 SSH 访问 —— 即使没 有也很容易架设。SSH 协议也是一个验证授权的网络协议;并且,因为其普遍性,架设和使用都很容易。
通过 SSH 协议克隆版本库,你可以指定一个 ssh:// 的 URL:
优势 首先,SSH 架设相对简单:SSH 守护进程很常见,多数管理员都有使用经验,并且多数操作系统都包含了它及相关的管理工具。其次,通过 SSH 访问是安全的 :所有传输数据都要经过授权 和加密。最后,与 HTTPS 协议、Git 协议及本地协议一样,SSH 协议很高效,在传输前也会尽量压缩数据。
缺点 它不支持匿名访问 Git 仓库。如果你使用 SSH,那么即便只是读取数据,使用者也 必须 通 过 SSH 访问你的主机, 这使得 SSH 协议不利于开源的项目,毕竟人们可能只想把你的仓库克隆下来查看。如果你只在公司网络使用,SSH 协议可能是你唯一要用到的协议。如果你要同时提供匿名只读访问和 SSH 协议, 那么你除了为自己推送架设 SSH 服务以外, 还得架设一个可以让其他人访问的服务。
2.4 Git 协议
这是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。要让版本库支持 Git 协议,需要先创建一个 git-daemon-export-ok 文件 —— 它是 Git 协议守护进程为这个版本库提供服务的必要条件 —— 但是除此之外没有任何安全措施。要么谁都 可以克隆这个版本库,要么谁也不能。这意味着,通常不能通过 Git 协议推送。由于没有授权机制,一旦你开 放推送操作,意味着网络上知道这个项目 URL 的人都可以向项目推送数据。很少有人会这样使用
优点 目前,Git 协议是 Git 使用的网络传输协议里最快的。如果你的项目有很大的访问量,或者你的项目很庞大并且 不需要为写进行用户授权,架设 Git 守护进程来提供服务是不错的选择。它使用与 SSH 相同的数据传输机制, 但是省去了加密和授权的开销。
缺点 缺乏授权机制。把 Git 协议作为访问项目版本库的唯一手段是不可取的。一般的做法里,会同时 提供 SSH 或者 HTTPS 协议的访问服务,只让少数几个开发者有推送(写)权限,其他人通过 git:// 访问只有 读权限。Git 协议也许也是最难架设的。它要求有自己的守护进程,这就要配置 xinetd、systemd 或者其他 的程序。它还要求防火墙开放 9418 端口,但是企业防火墙一般不会开放这个非标准端口。而大型的企业防火墙通常会封锁这个端口。