我正在尝试更多地了解 FTP/SFTP 的内部结构和底层技术(完全新手警报!)像许多开发人员一样,我在工作流程中使用 Git 和 Github,在学习 ftp 时,我想知道 git 使用什么协议将我的源代码文件发送到 Github(或任何代码托管 web 服务)
浏览手册页git-push
似乎没有提供任何有关文件传输所用底层技术的信息。我猜他们可能已经将其抽象化,以便可以使用其他文件传输,但我想知道 Git Push 用于将数据发送到 Github 或 bitbucket 的默认方式是什么。
答案1
Git 使用各种不同的协议,具体取决于您的远程 URL 的样子。
如果您使用的是 HTTP 远程,它通常使用所谓的智能 HTTP 协议,该协议本质上是远程引用的 HTTP GET 请求加上用于发送丢失数据的 HTTP POST 请求。还有一种使用 WebDAV 的哑 HTTP 协议,但大多数托管服务提供商不再支持它。
如果您使用 SSH 远程,Git 会使用本机 Git 协议(也可通过未加密的连接使用)与远程端调用的 Git 程序通信。服务器不使用 SFTP 来实现这一点。
以前可以使用 FTP 进行 Git 操作,但现在几乎没人这样做了。这是因为 (a) FTP 很难保证安全,因为许多实现没有正确实现 TLS 行为,(b) FTP 很难在各种网络上使用,因为它需要打开多个端口,(c) HTTP 通常比 FTP 更快,(d) Git 可以通过连接与远程端协商而不是直接上传文件来发送少得多的数据。由于前三个原因,FTP 通常不常见,确实应该被视为过时。
SFTP 本质上是一种通过 SSH 连接进行的专用文件传输协议。在合理的 SSH 连接下,它被认为是安全的,是 FTP 的一个很好的替代方案。就发送的消息而言,它与 FTP 非常不同。Git 本身并不使用 SFTP,尽管可以使用 SFTP(例如,使用sshfs
)挂载远程目录,然后像本地存储库一样将其推送到该存储库。在这种情况下,Git 协议的两端实际上都在本地计算机上运行,并且文件是通过 SFTP 读取和写入的。