友情提示:本文共有 1937 个字,阅读大概需要 4 分钟。
Git已经成为代码版本控制的事实标准,但它的普及并没有消除对源代码库的历史和内容进行深入分析的复杂性。
另一方面,SQL是一种经过实战考验的语言,用于查询大型代码库,因为它被采用在Spark和BigQuery等项目。
因此,在 source{d}我们选择这两种技术来创建gitbase是合乎逻辑的:Code as Data解决方案,用于使用SQL对git存储库进行大规模分析。
Gitbase是一个完全开源的项目(github.com/src-d/gitbase),它站在一系列巨头的肩膀上,使其开发成为可能,这篇博文旨在指出主要的。
gitbase playground(github.com/src-d/gitbase-web)提供了使用gitbase的可视方式。
用vitess解析SQL
Gitbase的用户界面是SQL:这意味着我们需要能够解析和理解遵循MySQL协议通过网络到达的SQL请求。对我们来说幸运的是,这已经由我们在YouTube的朋友和他们的vitess(https://github.com/vitessio/vitess)项目实施。
我们只是抓住了对我们很重要的代码片段,并将它变成了一个开源项目github.com/src-d/go-mysql-server,允许任何人在几分钟内编写一个MySQL服务器(正如我在justforfunc(http://justforfunc.com/)剧集中所展示的那样CSVQL - 使用SQL提供CSV(https://youtu.be/bcRDXAraprk))。
Vitess是一个用于MySQL水平扩展的数据库集群系统。
用go-git读取git存储库
一旦我们解析了请求,我们仍然需要通过阅读数据集中的git存储库来找到如何回答它。为此,我们集成了source{d}最成功的存储库go-git(https://github.com/src-d/go-git)。
这使我们能够轻松地将存储在磁盘上的存储库分析为siva文件(同样是source{d}的开源项目),或者只是使用git clone克隆。
纯Go中的高度可扩展的Git实现。
使用enry检测语言并使用babelfish解析文件
Gitbase并没有停止其在git历史上的分析能力。通过将语言检测与我们(显然)的开源项目enry(https://github.com/src-d/enry)集成,并使用babelfish(https://github.com/bblfsh/bblfshd)进行程序解析。
当用户使用LANGUAGE和UAST时,这两个功能在gitbase中公开。他们一起提出诸如“查找上个月经常修改的功能名称”的请求。
babelfish是一个自托管服务器,用于通用源代码解析,将代码文件转换为通用抽象语法树(UAST)
让它加速
Gitbase分析非常大的数据集 - 例如 Public Git Archive,带有来自GitHub的3TB源代码(公告),并且每个CPU周期都是如此。
这就是我们将另外两个项目整合到一起的原因:Rubex和Pilosa。
加速Rubex和Oniguruma的正则表达式
Rubex moovweb/rubex(https://github.com/moovweb/rubex)是Go的regexp标准库包的标准替代品。我说quasi是因为他们没有在regexp.Regexp类型上实现LiteralPrefix方法,但是直到现在我也没有听说过这种方法。
Rubex从高度优化的C库Oniguruma(https://github.com/kkos/oniguruma)获得其性能,它使用cgo调用。
使用Pilosa索引加快查询速度
索引是基本上每个关系数据库的一个众所周知的特性,但Vitess并没有实现它们,因为它并不真正需要。
但是再次开源使用Pilosa(https://github.com/pilosa/pilosa)进行救援,这是一个在Go中实现的分布式位图索引,它使gitbase可用于大量数据集。
Pilosa是一个开源的分布式位图索引,可以显着加速跨多个海量数据集的查询。
结论
我想利用这篇博文来亲自感谢开源社区,它使我们能够在如此短的时间内创建gitbase,这是任何人都期望的。在source{d},我们坚信开源,github.com/src-d(包括我们的OKR和投资委员会)下的每一行代码都证明了这一点。
你想尝试一下gitbase吗?最简单快捷的方法是使用source{d}引擎。从sourced.tech/engine下载并使用单个命令运行gitbase!
https://sourced.tech/engine
本文如果对你有帮助,请点赞收藏《gitbase:使用SQL语句查询git的repo》,同时在此感谢原作者。