企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 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://` 访问只有读权限。