XingPiaoLiang's

Back









项目申请书



项目名称:跨平台客户端 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 对相关知识进行巩固。

项目实现细节#

项目具体产出要求如下:

  1. 实现跨平台,要求在 MacOS、Linux 和 Windows 下功能一致;
  2. Monobean 可以通过 Mega 的去中心化服务实现从多个客户端传输代码;
  3. Monobean 可以实现本地仓库的一个目录映射为 GitHub 的一个仓库,实现代码、PR、Issue 的双向同步;
  4. 通过滑动窗口算法等算法实现 Git Pack 文件的 encoding ,改进 decoding 部分算法,提升整体速度;
  5. 在当前版本上继续完善 Monobean 的功能,对接 Mega 的代码管理 API ,实现仓库管理能力以及客户端基本配置能力;

根据项目具体产出要求,我将整个项目分为两个模块进行开发:

  • Monobean GUI 应用程序
  • Git Pack 文件优化 & 去中心化传输机制

具体实现细节结构图如下:

image-20250612100919607

Monobean 应用程序#

实现跨平台兼容性(MacOS / Linux / Windows)#

Monobean 使用 GTK-rs 框架开发,天然支持跨平台。结合我使用 Tauri 框架的跨平台开发经验(参考 petrol-app ) ,我将基于 GTK-rs , 在三平台中统一构建流程,充分利用 Github Actions 自动化 CI/CD 实现三端一致的构建、测试、打包和发布。

GUI 界面设计#

主窗口布局目前设想设计面板:

u 预计使用以下 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 (终端输出)
rust

Github 双向同步功能开发#

本模块旨在将 Monobean 客户端中的特定目标直接映射为一个远程的 Github 仓库,对应项目具体产出要求的第三点,将支持以下功能:

  • Github OAuth 登录与授权
  • 推送本地变更至远程仓库
  • 实时同步拉取 PR / Issue 信息,实现在本地展示、创建或评论。 我将基于 Github REST 官方 API 进行开发以及前后端对接。 并通过结合已有的 git2-rs 开源库来对仓库的状态进行管理,提高项目开发的效率。

客户端对接 Mega 代码管理 API#

Mega 引擎的 Git 端代码管理 API 基于 Libra 模块(一个使用 Rust 实现的 Git 客户端,提供了标准的 Git 命令接口)。

去中心化传输及 Git Pack 算法优化#

Monobean 实现去中心化传输#

实现去中心化传输服务,在我看来存在以下五个维度的问题需要解决:

  • 去中心化发现
  • 传输效率及传输方式
  • ssh 身份验证
  • 数据安全
  • 冲突处理

整体结构思路如下:

image-20250612103905389

在 Mega 的 Gateway 模块中分别提供了 HTTP 和 P2P 两种协议的实现,要是实现去中心化传输,我们需要利用 P2P 相应的实现。

以分享代码仓库为例,Monobean 需要遵循 Mega 引擎中相应的 API 实现,分享者分享流程如下:

image-20250612111446730

上述流程体现在 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 的客户端基本配置能力及代码管理能力等功能实现。

2025-开源之夏 Proposal (未中选)
https://astro-pure.js.org/blog/2025-ospp
Author erasernoob
Published at July 1, 2025
Comment seems to stuck. Try to refresh?✨