## 4.1 协议
Git 支持四种传输协议:本地协议(Local)、HTTP协议、SSH(Secure Shell)协议以及 Git 协议。
### 4.1.1 本地协议
在本地协议(Local protocol)中,所谓的远程仓库就是硬盘或文件共享系统上的另一个目录。
而想要克隆本地版本库,可以执行:
```
$ git clone [pwd]
$ git clone file://[pwd]
```
如果在 URL 开头明确的指定 `file://` ,那么 Git 的行为会有所不同。
* 仅指定路径:Git 会尝试使用硬连接或直接复制所有需要的文件。
* 指定 `file://` :Git 会触发平时用于网络传输资料的进程,通常效率较为低。
要增加一个本地版库到现有的 Git 项目,可以执行:
```
$ git remote add [repo] [pwd]
```
**优点**
简单,并且直接使用了现有的文件权限和网络访问权限。
**缺点**
* 通常共享文件系统比较难配置
* 比起基本的网络连接访问,其不便从多个位置访问
* 不保护仓库避免意外的损坏,因为每个用户都有远程仓库的完整 shell 权限
### 4.1.2 HTTP/S 协议
Git 通过 HTTP 通信有两种模式。在 Git 1.6.6 版本之前只有一个方式可用,通常是只读模式。Git 1.6.6 版本引入了一种新的、更智能的协议,让 Git 可以向通过 SSH 那样智能的协商和传输数据。
**智能(Smart)HTTP协议**
与 SSH 及 Git 协议类似,只是运行在标准的 HTTP/S 端口上并且可以使用各种 HTTP 验证机制。
**哑(Dumb)HTTP协议**
哑 HTTP 协议里 Web 服务器仅把裸版本库当作普通文件对待,提供文件服务,但只读。基本上只需要把一个裸的版本库放在 HTTP 根目录,设置一个叫做 `post-update` 的挂钩(Git 挂钩)。
设置从 HTTP 访问版本库的方法:
```
$ cd /var/www/htdocs/
$ git clone --bare [pwd] gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update
```
Git 自带的 `post-update` 挂钩会默认执行合适的命令(`git update-server-info`)来确保通过 HTTP 的获取和克隆操作正常工作。
设置完成后,就可以通过类似的命令拷贝仓库:
```
$ git clone http://[url]
```
**优点**
不同的访问方式秩序要一个 URL 以及服务器只在授权时提示输入授权信息。
**缺点**
架设 HTTP/S 协议的服务端会比 SSH 协议更麻烦。
如果需要授权的推送,管理凭证会比使用 SSH 协议密钥认证麻烦一些。
### 4.1.3 SSH 协议
SSH 是一种传输协议,同时也是一个验证授权的网络协议。通过 SSH 协议克隆版本库,可以指定一个 `ssh://` 的 URL:
```
$ git clone ssh://[pwd]
```
或者使用一个简短的 scp 式写法:
```
$ git clone user@server:project.git
```
**优点**
* SSH 架设相对简单,SSH 守护进程很常见
* SSH 访问时安全的,所有传输数据都要进过授权和加密
* 传输前尽量压缩数据
**缺点**
不能匿名访问,即便只要读取数据。
### 4.14 Git 协议
一个包含在 Git 软件包中的特殊守护进程; 它会监听一个提供类似于 SSH 服务的特定端口(9418),类似于 SSH 服务,但无需任何访问授权。要让版本库支持 Git 协议,需要先创建一个 `git-daemon-export-ok` 文件,它是 Git 协议守护进程为这个版本库提供服务的必要条件。
通过下面命令可以克隆一个使用 Git 协议的版本库:
```
$ git clone git:[url]
```
**优点**
网络传输中速度最快的。
**缺点**
缺乏授权机制,一般的做法会同时提供 SSH 或者 HTTPS 协议的访问服务,只让少数几个开发者有推送权限。其他人通过 `git://` 访问只有读权限。
- 介绍
- 第一章 起步
- 1.1 关于版本控制
- 1.2 Git 简史
- 1.3 Git 基础
- 1.4 命令行
- 1.5 安装 Git
- 1.6 初次运行 Git 前的配置
- 1.7 获得帮助
- 第二章 基础
- 2.1 获取仓库
- 2.2 记录每次更新到仓库
- 2.3 查看提交历史
- 2.4 撤销操作
- 2.5 远程仓库的使用
- 2.6 打标签
- 2.7 Git 别名
- 第三章 分支
- 3.1 分支简介
- 3.2 分支的新建与合并
- 3.3 分支管理
- 3.4 分支开发工作流
- 3.5 远程分支
- 3.6 变基
- 第四章 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上搭建 Git
- 4.3 生成 SSH 公钥
- 4.4 配置服务器
- 4.5 Git 守护进程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的选择
- 第五章 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一个项目贡献
- 5.3 维护项目
- 第六章 GitHub
- 6.1 账户的创建和配置
- 6.2 对项目做出贡献
- 6.3 维护项目
- 6.4 管理组织
- 6.5 脚本 GitHub
- 第七章 Git 工具
- 7.1 选择修订版本
- 7.2 交互式暂存
- 7.3 储藏与清理
- 7.4 签署工作
- 7.5 搜索
- 7.6 重写历史
- 7.7 重置揭密
- 7.8 高级合并
- 7.9 Rerere
- 7.10 使用Git调试
- 7.11 子模板
- 7.12 打包
- 7.13 替换
- 7.14 凭证存储
- 第八章 自定义 Git
- 8.1 配置 Git
- 8.2 Git 属性
- 8.3 Git 钩子
- 8.4 使用强制策略的一个例子
- 第九章 Git 与其他系统
- 9.1 作为客户端的 Git
- 9.2 迁移到 Git
- 第十章 Git 内部原理
- 10.1 底层命令和高层命令
- 10.2 Git 对象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用规格
- 10.6 传输协议
- 10.7 维护与数据恢复
- 10.8 环境变量
