文档章节

码云已经支持 Git Wire Protocol

Force武装卫队
 Force武装卫队
发布于 2018/09/05 16:04
字数 1949
阅读 2.3K
收藏 5

3 月,跳不动了?>>>

前言

两个半月前,Google 开发者宣布了 Git Wire Protocol,即 Git v2 协议,Git Wire Protocol 协议改进了 Git 的传输过程,增加了可扩展性。关于协议的背景和细节介绍,大家可以去 《码云即将支持 Git v2 Protocol》 了解。

进展

两个多月过去了,我们可以大声的告诉大家,码云目前已经支持 Git Wire Protocol。

码云的 Git SSH 服务器并不是 OpenSSH,而是基于 libssh 开发的一个服务,叫 Basalt Sshd。用户可以通过使用命令:

ssh -Tvvv git@gitee.com

在命令输出里面可以找到类似下面的字符串。

debug1: Remote protocol version 2.0, remote software version Basalt-1.2

对码云比较了解的朋友应该知道,码云目前已经完全改造成分布式了,而 Basalt 是码云的 SSH 服务,它需要与存储机器上的 git-srv 建立连接,无论是 fetch 还是 push,码云都是通过启动 git 命令实现的,这样的好处是能够享受 git 改进带来的性能优势和增加的新功能。这一点,无论是 libgit2 还是 JGIT 都并不容易做到的。

分析了码云平台 Git 传输的架构,那么就可以知道如何实现对 Git Wire Protocol 的支持,首先得让 Basalt 接受环境变量,然后得传递给 git-srvgit-srv 在启动的时候设置 git 命令的环境变量即可,很简单吗,没有一点难度。当然需要等待 git 2.18 的发布,码云在计划支持 Git Wire Protocol 就等了一段时间。

在 libssh 的 channel_env_request_function callback 中就可以接受环境变量,这里就可以得知请求是否是 v2 的,在 git-srv 中,我们在传输数据之前有个 Handshake 阶段,在 Handshake 数据包中增加一个字段即可。

等到 git 2.18 发布后,我们将所有后端服务器上的 Git 升级到 2.18,然后升级所有的 git-srv,最后把 Basalt 升级了,然后就支持 Git Wire Protocol 了。

我们使用 git-dist 升级的 git/cmake。

# update git
bash <(curl -fsSL https://gitee.com/oscstudio/git-dist/raw/master/git-dist.sh)
# update cmake
bash <(curl -fsSL https://gitee.com/oscstudio/git-dist/raw/master/cmake.sh)

以上是 SSH,那么 HTTP,GIT 呢?

在码云的设计中,HTTP 也应当直接与 git-srv 通讯,而在 Gitlab 中,提供 Git HTTP 功能的是 grack,但 Gitlab 都有几年没有维护 Grack 了,他们已经使用 gitaly 了,虽然码云也将完全去除 grack,但由于各种各样的原因,目前依然使用 grack 提供 Git HTTP 访问。为了让开发者及早的体验 Git Wire Protocol,笔者一个非 Ruby 开发人员不情愿的改进了 Grack: https://gitee.com/oscstudio/grack 。如果哪一天你使用 HTTP 体验了 Git Wire Protocol,那就说明我们更新了。

git:// 协议没有验证机制,为了避免恶意请求,我们也就没有开放 git:// 协议,但我们内部同步使用了 git:// 协议,并且也在第一时间支持了 Git Wire Protocol.

如何使用

我们可以设置 git config,使默认的传输使用 v2。

针对存储库的设置:git config protocol.version=2
针对全局设置: git config --global protocol.version=2

git 实际上可以使用 -c 去强制指定一些设置,所以可以使用 git -c protocol.version=2 clone url 这样的格式去使用 v2 协议去克隆或者操作 git 存储库。

如果已经码云上已经有存储库了,可以使用 ls-remote 查看 Git Wire Protocol 细节。

GIT_TRACE=1 GIT_TRACE_PACKET=1 git -c protocol.version=2 ls-remote

这是 oscstudio/grack 的输出:

15:52:27.525041 git.c:415               trace: built-in: git ls-remote
15:52:27.525181 run-command.c:637       trace: run_command: unset GIT_CONFIG_PARAMETERS GIT_PREFIX; GIT_PROTOCOL=version=2 ssh -o SendEnv=GIT_PROTOCOL git@gitee.com 'git-upload-pack '\''oscstudio/grack.git'\'''
15:52:27.941054 pkt-line.c:80           packet:          git< version 2
15:52:27.941085 pkt-line.c:80           packet:          git< agent=git/2.18.0
15:52:27.941091 pkt-line.c:80           packet:          git< ls-refs
15:52:27.941096 pkt-line.c:80           packet:          git< fetch=shallow
15:52:27.941101 pkt-line.c:80           packet:          git< server-option
15:52:27.941107 pkt-line.c:80           packet:          git< 0000
15:52:27.941113 pkt-line.c:80           packet:          git> command=ls-refs
15:52:27.941127 pkt-line.c:80           packet:          git> agent=git/2.18.0
15:52:27.941133 pkt-line.c:80           packet:          git> 0001
15:52:27.941150 pkt-line.c:80           packet:          git> peel
15:52:27.941156 pkt-line.c:80           packet:          git> symrefs
15:52:27.941160 pkt-line.c:80           packet:          git> 0000
15:52:27.967209 pkt-line.c:80           packet:          git< 715a91a2b22de70a78ba7e0cda2e36a65885184b HEAD symref-target:refs/heads/master
15:52:27.989776 pkt-line.c:80           packet:          git< 642cbc5f73d6eb1947f3120e48cd8c401dd66961 refs/fetches/wenjiachengy/wire_debug
15:52:27.989817 pkt-line.c:80           packet:          git< d77535c7d2892fede73f957d7041e66f6196c1da refs/heads/dev
15:52:27.989829 pkt-line.c:80           packet:          git< 715a91a2b22de70a78ba7e0cda2e36a65885184b refs/heads/master
15:52:27.989866 pkt-line.c:80           packet:          git< 94fafdc22aecf4561a7a94bd76a97336ab845654 refs/heads/stderr
15:52:27.989883 pkt-line.c:80           packet:          git< 715a91a2b22de70a78ba7e0cda2e36a65885184b refs/heads/wire
15:52:28.005575 pkt-line.c:80           packet:          git< 9795dec8d00c9c402ebf3db9e9d0f637d4f9dd6f refs/heads/wire_debug
15:52:28.033921 pkt-line.c:80           packet:          git< 34eb1b8d0be0398044b45660effb9cfa21f2f324 refs/pull/1/MERGE
15:52:28.033973 pkt-line.c:80           packet:          git< 36053e3bed3c355b0f184138df4d5e97a66a529a refs/tags/v0.1 peeled:623bc4f455bca96a6431e20babb436974417a5fc
15:52:28.033992 pkt-line.c:80           packet:          git< 30d8963cefb373b9ccc10caebc80859f7e32ca28 refs/tags/v0.2 peeled:5295cd7b31a85197949c9f348210965907c7214b
15:52:28.034013 pkt-line.c:80           packet:          git< eac92e5bd234f6a42db3f63a55c6909311ac998d refs/tags/v1.0.0
15:52:28.034032 pkt-line.c:80           packet:          git< a6c716e02da853e811b96e6a6c37e21ec893a06a refs/tags/v2.0.0
15:52:28.034047 pkt-line.c:80           packet:          git< 0000
15:52:28.034060 pkt-line.c:80           packet:          git> 0000
From git@gitee.com:oscstudio/grack.git
715a91a2b22de70a78ba7e0cda2e36a65885184b	HEAD
642cbc5f73d6eb1947f3120e48cd8c401dd66961	refs/fetches/wenjiachengy/wire_debug
d77535c7d2892fede73f957d7041e66f6196c1da	refs/heads/dev
715a91a2b22de70a78ba7e0cda2e36a65885184b	refs/heads/master
94fafdc22aecf4561a7a94bd76a97336ab845654	refs/heads/stderr
715a91a2b22de70a78ba7e0cda2e36a65885184b	refs/heads/wire
9795dec8d00c9c402ebf3db9e9d0f637d4f9dd6f	refs/heads/wire_debug
34eb1b8d0be0398044b45660effb9cfa21f2f324	refs/pull/1/MERGE
36053e3bed3c355b0f184138df4d5e97a66a529a	refs/tags/v0.1
623bc4f455bca96a6431e20babb436974417a5fc	refs/tags/v0.1^{}
30d8963cefb373b9ccc10caebc80859f7e32ca28	refs/tags/v0.2
5295cd7b31a85197949c9f348210965907c7214b	refs/tags/v0.2^{}
eac92e5bd234f6a42db3f63a55c6909311ac998d	refs/tags/v1.0.0
a6c716e02da853e811b96e6a6c37e21ec893a06a	refs/tags/v2.0.0

使用 Wire 协议的好处

场景 好处
clone 浅表克隆之类的操作被简化了
fetch 能够过滤掉不需要的引用,意味着只需要关系自己的分支
push 暂未使用

当你在码云上有存储库,并且存储库分支比较多的时候,你可以分别使用如下命令观察:

GIT_TRACE=1 GIT_TRACE_PACKET=1 git -c protocol.version=2 fetch origin master
GIT_TRACE=1 GIT_TRACE_PACKET=1 git fetch origin master

可以发现 v1 协议需要去查看所有的引用,而 Wire 并不需要这样做。当然 Wire 才推出不久,用户体验上改进还不是很明显,但随着 git 其他功能与 wire 传输协议的整合,用户在使用 git 的感受也将越来越好。

Git V2 协议总结

Google 云平台最开始支持 Git Wire Protocol,现在码云也支持了,下面是厂商支持列表:

平台 是否支持 Git v2
Gitee 支持 SSH/HTTP
Github 不支持
Gitlab 在做,但 Gitlab.org 不支持
Bitbucket 不支持
Gitea 不支持,但有 Issue 讨论
Gogs 不支持,但有 Issue 讨论
Coding 不支持

Git V2 对于一些小型存储库并不明显,但对于浅表克隆,海量分支的项目,v2 带来的改进非常明显,另外其扩展性对于 git 正在做的部分克隆(类似 Git VFS/GVFS)非常有利,随着项目规模的扩大,Git 这种分布式版本控制系统越来越力不从心,不断的出现 Git LFS, Git GVFS 也就是人们不断的探索。

其他改进

无论是 SSH 还是 HTTP,码云的基础设施团队都对其进行了大量的改进,比如目前的 Basalt libssh 已经升级到 0.8.1,修复了 ED25519 HostKey 的支持,对于一些网络不稳定,或者特殊存储库克隆到 100% 时,出现 Broken Pipe 错误,我们也已经修复。

如果诸位再次出现此错误,那就给我们反馈,如果是我们的错误那就说明可能还没有修复。

我们还有提升了 git-srv 的稳定性。

对于 Basalt 而言,错误提示现在更加清晰,用户一眼就知道错误出现在哪里。比如克隆一个不存在的存储库提示如下:

下一步

除了这些改进,码云还有 Git LFS,SVN-SSH 等等功能即将上线,码云基础设施团队还实现了一个 Git VFS (aka GVFS) 的原型,大家有更好的想法和建议欢迎与码云开发者交流。

© 著作权归作者所有

Force武装卫队

Force武装卫队

粉丝 205
博文 29
码字总数 65879
作品 3
深圳
高级程序员
私信 提问
加载中

评论(9)

zyuyou
zyuyou
码云极速下载可以同步intellij-community的仓库
吗?
红薯
红薯

引用来自“红薯”的评论

引用来自“Force武装卫队”的评论

引用来自“红薯”的评论

有没有一个不同版本直接的比较表格?
已经有了

哪里?

引用来自“Force武装卫队”的评论

你是说协议版本直接比较?
从使用者角度,最关心的是两个版本有什么区别,我为什么要用 v2 ?
Force武装卫队
Force武装卫队 博主

引用来自“红薯”的评论

引用来自“Force武装卫队”的评论

引用来自“红薯”的评论

有没有一个不同版本直接的比较表格?
已经有了

哪里?
你是说协议版本直接比较?
红薯
红薯

引用来自“Force武装卫队”的评论

引用来自“红薯”的评论

有没有一个不同版本直接的比较表格?
已经有了

哪里?
Force武装卫队
Force武装卫队 博主

引用来自“tzm529”的评论

现在使用越来越慢了
能不能提供详细信息。
Force武装卫队
Force武装卫队 博主

引用来自“红薯”的评论

有没有一个不同版本直接的比较表格?
已经有了
tzm529
tzm529
现在使用越来越慢了
红薯
红薯
有没有一个不同版本直接的比较表格?
小柒2012
小柒2012
厉害了我的云
U盘或邮件审核代码作业太繁琐?你该试试 Git 分支 | 码云高校版最佳实践

作者介绍 高校的传统软件工程实践教学方式,即学生在实验室编写好代码,通过使用U盘拷贝或者QQ邮箱的方式发送给教师审核代码,过程繁琐且易出问题。而在码云使用 Git 分支之间互不影响,成员...

码云Gitee
2018/09/17
0
0
将项目同时托管到Github和Git@OSC

GIT@OSC是国内最大的git代码托管平台,支持免费私有库,支持SVN操作,用户众多。 很多开发者希望在不同的代码托管平台都有托管一份,这个对于git来说并不是一件麻烦的事情,而GIT@OSC也支持从...

Force武装卫队
2015/04/21
1.5W
40
Visual Studio 的码云扩展 - Gitee Extension for Visual Studio

Visual Studio 的码云扩展 安装 当前发布版本 Visual Studio Marketplace 最新构建版本 Open VSIX Gallery 注:Gitee.VisualStudio 只支持 Visual Studio 2015/2017/2019。 使用 Visual Stu......

麦壳饼
2019/03/20
1.3K
0
项目迁移:从码云迁移到Github

之前因为某些原因,在码云gitee创建了一些项目,无奈到后来发觉码云生态活跃度还是不能和github比的,于是打算把项目迁移到github上。 但是项目迁移却遇到了问题,码云支持从Github导入,Gith...

赵客缦胡缨v吴钩霜雪明
2018/11/22
0
0
码云目前已经初步支持 Git 部分克隆

最近 Git 2.25.0 发布,此次发布推出了 partial clones 功能,partial clones 即用户克隆远程存储库的时候,可以选择只下载自身所需的对象,而不是存储库的所有对像(或者特定 commit 所关联...

Force武装卫队
01/17
8.2K
22

没有更多内容

加载失败,请刷新页面

加载更多

电脑录屏软件哪个好?轻松搞定屏幕录制的技巧

电脑录屏软件哪个好?在网上能找到不少有关电脑录屏的软件,且质量上也是参差不齐的。使用录屏工具时由于不知道录屏软件哪个好在录制视频经常会遇到各式各样的问题,不是录制后视频出现卡顿就...

cenfeng123
16分钟前
20
0
适用于Mac电脑的Python开发工具哪款好用?

适用于Mac电脑的Python开发工具哪款好用?WingPro 7 Mac版好用吗?wingpro mac破解版是一款跨平台 Python IDE 系列通过强大的集成编辑,调试,单元测试和项目管理功能,使Python开发变得更加...

mac小叮当
17分钟前
9
0
对于产品开发而言一些想法。

如果你在做一个产品,那么就尽量把这个产品打磨的用心些,除非只是给你自己用的工具,不会去出售或者提供服务的。 因为你前期如果不花时间去琢磨这些事情,那么后面产品不断的出现问题,所花...

开源中国最牛的人
18分钟前
28
0
电子音乐与传统音乐的区别

音乐有着悠久的历史,但电子音乐是随着现代科技发展而发展起来的,电子音乐是音乐创作结合计算机的技术,形成在计算机平台上发展的新音乐形式。这种音乐形式不是以传统的乐器为创作工具,而是...

奇亿音乐
24分钟前
18
0
Oracle创建设置查询权限用户

--普通用户test,需要创建查询用户(cxtest),授权test的部分表或试图查询权限 -- 使用 SYSTEM创建用户 create user cxtest  identified by cxtest  default tablespace USERS  te...

wzb88
29分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部