其他

开源中国 2018-05-24


分布式版本控制系统 Git 将迎来巨大的性能提升 —— Git 协议 v2 已正式推出。


来自 Git 团队的 Brandon Williams 今天在博客上宣布推出了 Git 协议的 v2 版本(Git protocol version 2),以作为分布式版本控制系统 Git 的线协议(wire protocol)的主要更新。Git 协议 2.0 版本效率更高,并拥有显著的性能优势。


新的 Git 线协议为 reference 提供服务端过滤、让扩展新特性变得更容易以及简化 HTTP 传输的客户端处理。


谷歌已经在内部使用新版本的 Git 协议来提升速度。Brandon Williams 解释道:“对于包含 500k references 的仓库中的单个分支的无操作读取,性能提升了 3 倍。新版本协议还使得从 googlesource.com 服务器发送出来的开销字节数减少到原先的八分之一。这种改进主要是由于只返回客户端需要的 reference。”


Git protocol-v2 的开发成果在不到两周前合并到了 Git 2.18 的 mainline 上。凭借着显著的优势,谷歌已经在 Google Source 和 Cloud Source 仓库的 Git 服务器上支持这项新协议。


简化 HTTP 传输的客户端处理


开发新协议的主要动机是能够为引用(分支和标记)提供服务器端过滤。在协议 v2 之前,服务器以初始引用通告来响应所有拉取命令,列出代码仓库中的所有引用。即使客户端只关心更新单个分支,比如`git fetch origin master`,也会发送这整个列表。


针对含有数十万引用(Chromium 代码仓库就有超过 50 万个分支和标记)的仓库,服务器可能最终发送数十 MB 的数据,但这些数据却被忽略。这在拉取期间通常占用大量的时间和带宽,尤其是当你远程更新只有几个提交的分支时,或者甚至当你只检查是否最新,因而导致无操作拉取时。


而 Git 协议 v2 在含有 50 万个引用的仓库上对单个分支执行无操作拉取的性能提高了3倍。协议 v2 还使从 googlesource.com 服务器发送的开销字节(non-packfile)减少了 8 倍。这种改进主要归功于将服务器通告的引用过滤成客户端表示感兴趣的引用。


克服障碍


这些年来,Git 项目作过多次尝试,试图限制初始引用通告,或者完全改用一种新的协议,但依然碰到了两个问题:


(1)初始请求僵硬,又不包含可用于在不破坏与现有服务器兼容性的情况下请求新服务器修改响应的字段。


(2)错误处理机制的定义不够完善,无法安全地使用现有服务器不了解的新协议,并快速退回到旧协议。


为了改用新的协议版本,我们需要找到现有服务器会忽略,但可以用来安全地与新服务器通信的一条旁路(side channel)。


有三种主要的传输方式用来支持 Git 的线路协议(git://、ssh:// 和 https://),用来请求 v2 的这条旁路在通信时需要确保旧服务器会忽略发送的任何额外数据,且不会崩溃。


  • http 传输方式最简单,因为我们只需在请求中加入一个额外的 http 报头(如“Git-Protocol: version=2”)。

  • ssh 传输方式要难一点,因为它需要将环境变量(“GIT_PROTOCOL=version=2”)发送到远程终端上。这个更具挑战性,因为它需要服务器管理员配置 sshd,以便在服务器端接收新的环境变量。

  • 最难的传输方式是匿名Git传输(git://)。


详情请查看谷歌的 Open-Source 博客:


  • https://opensource.googleblog.com/2018/05/introducing-git-protocol-version-2.html 




推荐阅读

“操作系统是中国网络安全短板,建议都用国产系统”

Google AI “作恶”,4000 员工抗议,十余人失望辞职!

锤子又为开源捐款!480 万门票收入捐给 OpenSSL 与 OpenBSD

没想到吧!Intellij IDEA 神器还有这些小技巧

谷歌终于开放 ".app" 顶级域名注册

点击“阅读原文”查看更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存