秦绍鹏
秦绍鹏
Published on 2026-03-28 / 3 Visits
0
0

造轮子记:我写了一个“跑在百度网盘上的 Git”,解决大容量异地备份痛点!

作为一个有“数据囤积癖”的开发者,我经常遇到这样的场景:本地有一大堆学习资料、Obsidian 笔记仓库或是个人的小项目文件。我想给它们做版本控制,也想在多台电脑间同步,但传统的方案总是不那么尽如人意:

  • 用 Git + GitHub/Gitee?:免费仓库有容量限制,传一些大型的二进制文件、视频或几十兆的 PDF 简直是灾难,而且很容易把仓库撑爆。
  • 用直接同步盘(如坚果云/OneDrive)?:缺乏“版本快照”的概念,一旦误删或被勒索病毒加密,找回历史版本非常麻烦;而且面对数万个碎文件的项目,同步软件经常卡死。
  • 直接打包传百度网盘?:每次都要手动压缩、手动上传、手动记录这是哪一天的备份,极其反人类。
  • 不要问我为什么用百度网盘的自动备份功能:再开一个软件不觉得很混乱吗?,况且... 懂得都懂。

于是,我萌生了一个想法:为什么不把 Git 的优秀设计和百度网盘的海量存储结合起来呢?

说干就干,我基于 Python 和百度网盘开放平台(Baidu PCS API),开发了一款名为 [GitDuPan] 的数据管理工具!

🌟 GitDuPan 是什么?

简单来说,它是一个操作体验无限接近于 Git,但数据实际存储在百度网盘上的版本控制与同步工具。

你只需要在终端敲下熟悉的代码,就能完成数据的本地快照与云端同步:

$ gitdupan init
$ gitdupan add .
$ gitdupan commit -m "备份我的 Obsidian 笔记"
$ gitdupan push

就这样,你的数据被安全地进行了哈希去重,并以增量的方式备份到了百度网盘中!

管理员_ Windows PowerShell 2026-03-28 00-50-58_2.gif

![[管理员_ Windows PowerShell 2026-03-28 00-50-58_2.gif]]

🛠️ 填坑指南:如何让 Git 跑在网盘上?

在开发过程中,我并没有直接生搬硬套 Git 的所有底层,而是针对“网盘 API”的特性做了大量魔改和妥协。以下是几个核心的技术痛点和解决方案:

1. 碎文件上传的灾难 -> Pack 增量打包机制

原生的 Git 每次 commit 都会在 .git/objects 目录下产生大量的松散对象(Loose Objects)。如果你有一个包含 5000 个小文件的仓库,直接调用网盘 API 上传这 5000 个文件,会被网盘的“频控策略(QPS限制)”瞬间封杀,而且网络握手开销极大。

我的解法
我在本地依然保留了类似 Git 的 Blob/Tree/Commit 对象哈希存储机制,以实现本地的“秒级 Commit”。但在执行 gitdupan push 时,系统会自动比对远端 HEAD 和本地 HEAD,把所有缺失的增量对象打包成一个单一的 pack_<hash>.tar.gz 压缩包。
这样,无论你修改了 1 个文件还是 10000 个文件,最终发往百度网盘的永远只有一个大文件请求,完美绕过了 API 频控!

2. 超大压缩包的网络阻断 -> Superfile 分片与流式传输

在打包机制跑通后,我遇到了第二个坑。当我尝试备份一个几个 G 的大仓库时,上传过程中经常抛出 ConnectionResetError(10054)。原因是单次 HTTP 请求保持时间过长,被网盘服务器强行切断了。

我的解法
我重构了底层的网盘 API 客户端,实现了真正的 Superfile 分片上传机制

  • 在本地将庞大的 .tar.gz 包切分为标准的 4MB 分片。
  • 计算所有分片的 MD5,调用 precreate 接口预创建任务。
  • 带着进度条(使用了炫酷的 rich.progress),将分片逐个 upload,并在失败时引入指数退避重试机制
  • 全部传完后,调用 create 接口让网盘在云端进行合并。
    同理,在 pull 下载时,也改为了 chunk_size 流式写入硬盘,彻底杜绝了内存溢出和连接中断。

3. 忽略文件,解放双手 -> 拥抱 .dupanignore

每次手动 add <file> 太反人类了。为此我手写了一个路径解析器,完美兼容 .gitignore 的语法。
只需要在项目根目录建一个 .dupanignore 文件,写入 *.logbuild/,然后豪迈地敲下 gitdupan add .,系统就会自动过滤掉这些不需要备份的垃圾文件。

📦 如何体验?

为了让非 Python 开发者也能零门槛使用,我使用 PyInstaller 将整个项目打包成了一个独立的单文件 .exe

只需两步即可开始:

  1. 下载 gitdupan.exe 并将其扔进系统的环境变量目录。
  2. 去百度开发者平台申请一个免费的 App Key 和 Secret Key,然后执行:
    gitdupan login --app-key YOUR_KEY --secret-key YOUR_SECRET
    gitdupan remote add /apps/gitdupan/my_backup
    

接下来,你就可以像用 Git 一样管理你的个人资料了!

💡 写在最后

造这个轮子的初衷,是为了解决我个人的高频痛点。它目前还比较简陋,没有复杂的多分支合并(Merge/Rebase)功能,因为对于个人数据备份来说,一条直线的历史树(Fast-forward)通常已经足够了。

如果你也和我一样,苦于没有好的大文件异地增量备份方案,不妨试试 GitDuPan

欢迎在评论区交流,如果有大佬愿意一起完善(比如加入本地数据加密功能),也欢迎来提 PR!

开源地址:pengGgxp/gitdupan


Comment