Facebook推出新的源代码管理系统Sapling

Facebook(在俄罗斯被禁止)发布了用于公司内部项目开发的Sapling源代码管理系统。 该系统旨在提供一个熟悉的版本控制界面,可以扩展到跨越数千万个文件、提交和分支的非常大的存储库。 客户端代码是用 Python 和 Rust 编写的,并在 GPLv2 许可证下开放。

另外,开发了一个服务器部分,用于与存储库进行有效的远程工作,以及一个虚拟文件系统,用于像处理完整存储库一样处理存储库一部分的本地切片(开发人员可以看到整个存储库,但只复制请求的数据)到可访问的本地系统)。 Facebook基础设施中使用的这些组件的代码尚未开放,但该公司承诺将来会发布。 然而,Mononoke 服务器(Rust 中)和 VFS EdenFS(C++ 中)的原型已经可以在 Sapling 存储库中找到。 这些组件是可选的,Sapling 客户端足以工作,它支持克隆 Git 存储库、与基于 Git LFS 的服务器交互以及与 GitHub 等 git 主机一起工作。

该系统的主要思想是,当与提供存储库存储的特殊服务器部分交互时,所有操作都会根据开发人员正在处理的代码中实际使用的文件数量进行缩放,而不依赖于整个存储库的总大小。 例如,开发人员可能仅使用非常大的存储库中的一小部分代码,并且只有这一小部分而不是整个存储库将被传输到他的系统。 当访问存储库中的文件时,工作目录会动态填充,一方面,这可以让您显着加快代码部分的工作速度,但另一方面,当您第一次访问时,会导致速度减慢新文件并需要不断访问网络(单独提供和离线模式的提交准备)。

除了自适应数据加载之外,Sapling 还实现了旨在减少具有更改历史记录的信息加载的优化(例如,Linux 内核的存储库中 3/4 的数据是更改历史记录)。 为了有效地处理更改历史记录,与其关联的数据存储在分段视图中,这允许您从服务器下载提交图的单独部分。 客户端可以向服务器询问有关多个提交的关系的信息,并仅下载图表的必要部分。

该项目已经开发了过去 10 年,旨在解决通过一个主分支组织对非常大的整体存储库的访问时出现的问题,其中采用了“rebase”操作而不是“merge”操作。 当时,还没有使用此类存储库的开放解决方案,Facebook 工程师决定创建一个新的版本控制系统来满足公司的需求,而不是将项目拆分为小型存储库,这会导致更复杂的依赖管理(曾经,为了解决类似的问题,微软创建了GVFS层)。 最初,Facebook 使用 Mercurial 系统,而 Sapling 项目最初是作为 Mercurial 的补充而开发的。 随着时间的推移,该系统转变为一个独立的项目,拥有自己的协议、存储格式和算法,并且还扩展了与 Git 存储库交互的能力。

对于工作,提出了“sl”命令行实用程序,它实现了熟悉 Git 和 Mercurial 的开发人员所熟悉的典型概念、工​​作流程和界面。 Sapling 中的术语和命令与 Git 略有不同,但更接近 Mercurial。 例如,使用“书签”代替分支(不支持命名分支),默认情况下,执行克隆/拉取时,不会加载整个存储库,而仅加载主分支,没有提交的预标记(暂存区),而不是“git fetch”,使用“sl”命令 pull”,而不是“git pull” - “sl pull --rebase”,而不是“git checkout COMMIT” - “sl goto COMMIT”,而不是“git pull” - “sl pull --rebase”,而不是“git checkout COMMIT” - “sl goto COMMIT”的“git reflog” - “sl Journal”,以恢复更改而不是“git checkout - FILE” 指定“sl revert FILE”,并且“.”用于标识“HEAD”分支。 但总的来说,分支和克隆/拉/推/提交/变基操作的一般概念被保留。

在 Sapling 工具包的附加功能中,对“智能日志”(smartlog) 的支持非常突出,它允许您直观地评估存储库的状态,突出显示最重要的信息并过滤掉次要细节。 例如,当您运行不带参数的 sl 实用程序时,仅显示您自己的本地更改(外部更改会折叠)、外部分支的状态、更改的文件和提交的新版本。 此外,还提供了交互式 Web 界面,可以快速浏览智能日志、更改树和提交。

Facebook推出新的源代码管理系统Sapling

Sapling 的另一个显着改进是简化了修复和解析错误以及恢复到之前状态的过程。 例如,提供命令“sl undo”、“sl redo”、“sl uncommit”和“sl unamend”来回滚许多操作,提供“sl hide”和“sl unhide”命令来临时隐藏提交,以及通过交互式导航旧状态并返回到指定点命令“sl undo -i command”。 Sapling 还支持提交堆栈的概念,它允许您通过将复杂的功能分解为一组更小且更易于理解的增量更改(从基本框架到完成的功能)来组织逐步审查。

已经为 Sapling 准备了几个附加组件,包括用于审查更改的 ReviewStack 接口(GPLv2 下的代码),它允许您处理 GitHub 上的拉取请求并使用更改的堆栈视图。 此外,还发布了与 VSCode 和 TextMate 编辑器集成的附加功能,以及 ISL(交互式 SmartLog)接口和服务器的实现。

来源: opennet.ru

添加评论