2025-开源之夏 Proposal (未中选)
急急忙忙赶出来的一篇 Proposal
项目申请书
项目名称:跨平台客户端 Monobean 实现代码仓库、GitHub 同步和去中心化传输
项目主导师:余永康
申请人:erasernoob
日期:2025.06.04
邮箱:erasernoobx@outlook.com
目录#
项目背景#
Mega#
Mega 项目是由 Web3 Infrastructure Foundation 开源社区维护开发的一个开源项目,其是 Google Piper 系统的非官方开源实现。但与 Piper 官方不同的是,Mega 将 Piper 主要思想扩展后,并原生支持 Git,成为一个扩展性更高,更通用的 Monorepo(单一代码仓库)。其为管理大规模代码库、促进团队协作开发而生。
Monobean#
Monobean 是在 Mega 生态下的一个分支项目,作为 Mega 的桌面端跨平台 GUI,旨在深度集成 Mega 功能为用户提供简单友好的交互界面。整体使用 GTK-rs ↗ 框架进行开发,需要用到 GNOME 以及 Rust 开发的知识经验。
技术方法及可行性#
项目所涉及的关键技术包括 Git 原理、Rust 跨平台开发、GTK GUI 构建、GNOME 桌面集成、GitHub API 使用、网络协议设计等,下面我将从几个维度展开我的技术储备与实现方案。
代码版本控制#
GitLet ↗ 是伯克利公开课 CS61B 中的一个根据 Git 版本控制原理仿写一个实现 Git 主要功能的课程设计项目。我通过该课程的学习,熟悉并掌握了 Git 版本控制的原理,实现了自己的 GitLet 项目。因此我相信我能够胜任项目中相关任务的开发。
跨平台应用程序#
对于跨平台应用程序开发,我具有一定的经验。曾帮助学校重点实验室独立开发过基于 Tauri ↗ ( 基于Rust 跨平台应用开发框架)的工程计算软件 ↗,,该应用支持 MacOS、Linux 和 Windows 三平台下功能一致,并最终投入到实际的生产使用中。
前端界面#
我对前端界面开发,以及前端工程化有一定的兴趣和较深了解。在我的 Github 中也有着许多我参与以及主导的前端项目。从而让我知晓前端开发具体流程,具备组件化思维,具有基本的前端界面开发能力。
GNOME 开发#
我将Ubuntu 24.04 LTS Desktop 系统作为主力系统使用已一年有余,对于 GNOME 桌面应用,我有非常丰富的使用以及折腾经验,不论是界面还是功能使用,我都有着自己的见解。相信这会对我开发及完善 Monobean 项目有着极大的帮助。
GTK-rs 相关#
我已经通过 GTK-rs 官网上的入门文档 ↗ 详细了解了 GTK-rs 的开发流程和原理,通过做出了一些 Demo ↗ 对相关知识进行巩固。
项目实现细节#
项目具体产出要求如下:
- 实现跨平台,要求在 MacOS、Linux 和 Windows 下功能一致;
- Monobean 可以通过 Mega 的去中心化服务实现从多个客户端传输代码;
- Monobean 可以实现本地仓库的一个目录映射为 GitHub 的一个仓库,实现代码、PR、Issue 的双向同步;
- 通过滑动窗口算法等算法实现 Git Pack 文件的 encoding ,改进 decoding 部分算法,提升整体速度;
- 在当前版本上继续完善 Monobean 的功能,对接 Mega 的代码管理 API ,实现仓库管理能力以及客户端基本配置能力;
根据项目具体产出要求,我将整个项目分为两个模块进行开发:
- Monobean GUI 应用程序
- Git Pack 文件优化 & 去中心化传输机制
具体实现细节结构图如下:
Monobean 应用程序#
实现跨平台兼容性(MacOS / Linux / Windows)#
Monobean 使用 GTK-rs 框架开发,天然支持跨平台。结合我使用 Tauri 框架的跨平台开发经验(参考 petrol-app ) ,我将基于 GTK-rs , 在三平台中统一构建流程,充分利用 Github Actions 自动化 CI/CD 实现三端一致的构建、测试、打包和发布。
GUI 界面设计#
主窗口布局目前设想设计面板:
预计使用以下 Widget 进行构建,整个结构草图包括:
gtk::ApplicationWindow
├── gtk::HeaderBar
│ ├── gtk::Button (打开仓库)
│ ├── gtk::Button (同步 GitHub)
│ └── gtk::Button (去中心化传输)
├── gtk::Box (横向 main content)
│ ├── gtk::ScrolledWindow
│ │ └── gtk::ListBox (提交历史)
│ └── gtk::Box (右侧主视图)
│ ├── gtk::TreeView (文件变更)
│ └── gtk::Notebook (底部多 Tab)
│ ├── gtk::Box (提交信息)
│ │ ├── gtk::Entry
│ │ └── gtk::Button
│ ├── gtk::Box (PR / Issue)
│ └── gtk::Box (终端输出)
rustGithub 双向同步功能开发#
本模块旨在将 Monobean 客户端中的特定目标直接映射为一个远程的 Github 仓库,对应项目具体产出要求的第三点,将支持以下功能:
- Github OAuth 登录与授权
- 推送本地变更至远程仓库
- 实时同步拉取 PR / Issue 信息,实现在本地展示、创建或评论。 我将基于 Github REST 官方 API 进行开发以及前后端对接。 并通过结合已有的 git2-rs ↗ 开源库来对仓库的状态进行管理,提高项目开发的效率。
客户端对接 Mega 代码管理 API#
Mega 引擎的 Git 端代码管理 API 基于 Libra 模块(一个使用 Rust 实现的 Git 客户端,提供了标准的 Git 命令接口)。
去中心化传输及 Git Pack 算法优化#
Monobean 实现去中心化传输#
实现去中心化传输服务,在我看来存在以下五个维度的问题需要解决:
- 去中心化发现
- 传输效率及传输方式
- ssh 身份验证
- 数据安全
- 冲突处理
整体结构思路如下:
在 Mega 的 Gateway 模块中分别提供了 HTTP 和 P2P 两种协议的实现,要是实现去中心化传输,我们需要利用 P2P 相应的实现。
以分享代码仓库为例,Monobean 需要遵循 Mega 引擎中相应的 API 实现,分享者分享流程如下:
上述流程体现在 repo_share
API 中,相对应的,接收者克隆仓库时也能抽象出相应的连接流程:
Git Pack 算法优化#
Encoding (打包优化)我将通过以下三个方面来完成对目前打包算法优化:
- 通过滑动窗口 + 哈希匹配优化 delta 编码选择(即对象间差异压缩)
- 减少冗余的全量对象存储(non-delta entries)
- 降低整体 pack 文件体积,提高打包速度
具体实现伪代码
fn encode_pack(objects: &[Blob]) -> Vec<PackEntry> {
let mut pack_entries = Vec::new();
let mut window = SlidingWindow::new(32);
let mut object_index = HashMap::new();
for obj in objects {
// 在窗口中寻找最相似的 delta 基础对象
if let Some((base, delta)) = find_best_delta_candidate(&window, obj) {
let delta_data = compute_delta(&base, obj);
pack_entries.push(PackEntry::Delta {
base_id: base.id,
delta: delta_data,
});
} else {
pack_entries.push(PackEntry::Full {
data: obj.data.clone(),
});
}
window.push(obj.clone());
object_index.insert(obj.hash(), obj.clone());
}
pack_entries
}
rust相同的,Decoding (解包优化)我将通过以下思路达到减少冗余 I/O 和内存使用的优化效果:
- 使用 LRU 缓存算法复用解码后的结果对象
- 以复用内存池的方式,减少 I/O 请求,以及多余的内存分配
- 尝试使用多线程并行化处理 delta 应用,来提高解码时吞吐量
项目开发时间规划#
整个项目开发时间为 2025/7/1 ~ 2025/9/30,我将以周为单位,逐个完成项目中划分出来的每个要点模块。
第 1 周:环境准备#
- 熟悉 Monobean 当前代码结构
- GTK-rs + GNOME 桌面应用编译环境配置(MacOS / Linux / Windows)
- 划分功能模块、初步制定接口设计文档
第 2 ~ 3 周:Monobean 界面开发#
根据界面初始规划和设计,逐步完成各个界面的开发。
第 4 ~ 5 周:GitHub 同步模块开发#
- 实现本地仓库与 GitHub 仓库的目录映射逻辑
- 接入 GitHub API 实现代码同步、PR/Issue 创建与监听
第 6 ~ 7 周:Git Pack 文件编码 & 解码优化#
- 阅读并分析 Mega 当前编码/解码实现
- 基于滑动窗口算法优化编码效率,压缩体积
第 8~9 周:去中心化传输机制开发#
- 基于 Mega 实现多客户端之间的数据同步/广播
- 实现简单的传输状态显示与配置项可视化
第 10~11 周:项目整合与客户端配置管理#
- 打通所有模块流程,统一配置文件格式
- 对接 Mega API 实现远程仓库管理以及用户设置面板
第 12 周:完善项目并产出#
完整的 Monobean 应用程序产出。包括用户友好的 GUI 界面、Github 代码仓库等状态实时同步、基于 Mega 的客户端去中心化传输、基于 Mega 的客户端基本配置能力及代码管理能力等功能实现。