设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 45|回复: 11

仿git 百度网盘备份工具

[复制链接]
累计签到:14 天
连续签到:1 天
灌水成绩
8
19
2518
主题
帖子
积分

等级头衔

ID : 659

初级技术员

积分成就 测量币 : 2518
在线时间 : 0 小时
注册时间 : 2025-12-13
最后登录 : 2026-5-14

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-3-25 15:23:46 来自手机 | 显示全部楼层 |阅读模式 IP:香港
作为一个有“数据囤积癖”的开发者,我经常遇到这样的场景:本地有一大堆学习资料、Obsidian 条记堆栈或是个人的小项目文件。我想给它们做版本控制,也想在多台电脑间同步,但传统的方案总是不那么尽如人意:

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

于是,我萌生了一个想法:为什么不把 Git 的优秀设计和百度网盘的海量存储结合起来呢?
说干就干,我基于 Python 和百度网盘开放平台(Baidu PCS API),开发了一款名为 [GitDuPan] 的数据管理工具!🌟 GitDuPan 是什么?
简单来说,它是一个操作体验无穷接近于 Git,但数据实际存储在百度网盘上的版本控制与同步工具。
你只需要在终端敲下熟悉的代码,就能完成数据的本地快照与云端同步:$ gitdupan init$ gitdupan add .$ gitdupan commit -m "备份我的 Obsidian 条记"$ gitdupan push
就这样,你的数据被安全地进行了哈希去重,并以增量的方式备份到了百度网盘中!
🛠️ 填坑指南:怎样让 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_.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  太反人类了。为此我手写了一个路径剖析器,完美兼容 .gitignore 的语法。
只需要在项目根目次建一个 .dupanignore 文件,写入 *.log 或 build/,然后豪迈地敲下 gitdupan add .,体系就会自动过滤掉这些不需要备份的垃圾文件。📦 怎样体验?
为了让非 Python 开发者也能零门槛使用,我使用 PyInstaller 将整个项目打包成了一个独立的单文件 .exe。
只需两步即可开始:

    下载 gitdupan.exe 并将其扔进体系的环境变量目次。然后执行:gitdupan logingitdupan remote add /apps/gitdupan/my_backup接下来,你就可以像用 Git 一样管理你的个人资料了!
💡 写在最后
造这个轮子的初衷,是为了办理我个人的高频痛点。它目前还比力简陋,没有复杂的多分支合并(Merge/Rebase)功能,由于对于个人数据备份来说,一条直线的历史树(Fast-forward)通常已经足够了。
如果你也和我一样,苦于没有好的大文件异地增量备份方案,不妨试试 GitDuPan
欢迎在批评区交流,如果有大佬愿意一起完满(比如参加本地数据加密功能),也欢迎来提 PR!
开源地址:https://github.com/pengGgxp/gitdupan
精密测量技术论坛免责声明
重要声明:以上内容仅代表该作者观点,不代表本站精密测量技术论坛立场。
如有涉及侵权请尽快告知,我们将会在第一时间处理。作者原创内容未经允许不得转载!
站长联系邮箱:1339305021@qq.com
站长联系微信:dddnnbbb
累计签到:10 天
连续签到:1 天
灌水成绩
2
149
1255
主题
帖子
积分

等级头衔

ID : 866

测量学徒

积分成就 测量币 : 1255
在线时间 : 0 小时
注册时间 : 2026-3-6
最后登录 : 2026-5-14

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-4-3 04:55:14 | 显示全部楼层 IP:香港
既有上传也有下载 和git实现方式一样,不过现在的方式对于大文件支持有些差劲,我正在考虑怎么解决更好
回复

使用道具 举报

累计签到:13 天
连续签到:6 天
灌水成绩
0
158
1397
主题
帖子
积分

等级头衔

ID : 864

测量学徒

积分成就 测量币 : 1397
在线时间 : 0 小时
注册时间 : 2025-9-17
最后登录 : 2026-5-15

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-4-10 10:11:25 | 显示全部楼层 IP:香港
还不会用,有空研究研究
回复

使用道具 举报

累计签到:10 天
连续签到:1 天
灌水成绩
1
141
1262
主题
帖子
积分

等级头衔

ID : 844

测量学徒

积分成就 测量币 : 1262
在线时间 : 0 小时
注册时间 : 2025-10-9
最后登录 : 2026-5-15

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-4-1 20:47:38 | 显示全部楼层 IP:香港
同步是指同步上传还是下载?
回复

使用道具 举报

累计签到:10 天
连续签到:5 天
灌水成绩
1
167
1400
主题
帖子
积分

等级头衔

ID : 818

测量学徒

积分成就 测量币 : 1400
在线时间 : 0 小时
注册时间 : 2026-4-17
最后登录 : 2026-5-14

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-3-28 10:00:07 | 显示全部楼层 IP:香港
用于对obsidian笔记备份挺好
回复

使用道具 举报

累计签到:11 天
连续签到:1 天
灌水成绩
1
155
1179
主题
帖子
积分

等级头衔

ID : 858

测量学徒

积分成就 测量币 : 1179
在线时间 : 0 小时
注册时间 : 2026-2-27
最后登录 : 2026-5-15

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-3-31 20:13:59 | 显示全部楼层 IP:香港
是的,本来做这个的初衷就是为了备份笔记,git太轻量,有些个别的视频文件备份就有点难受。
回复

使用道具 举报

累计签到:10 天
连续签到:5 天
灌水成绩
3
162
1016
主题
帖子
积分

等级头衔

ID : 816

测量学徒

积分成就 测量币 : 1016
在线时间 : 0 小时
注册时间 : 2025-12-16
最后登录 : 2026-5-15

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-4-1 07:45:48 | 显示全部楼层 IP:香港
mark,不错的实现,这样的需求我也需要,因为平时需要把一些资料上传到网盘备份。谢谢分享
回复

使用道具 举报

累计签到:10 天
连续签到:3 天
灌水成绩
1
147
1271
主题
帖子
积分

等级头衔

ID : 861

测量学徒

积分成就 测量币 : 1271
在线时间 : 0 小时
注册时间 : 2026-1-21
最后登录 : 2026-5-15

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-4-8 10:43:18 | 显示全部楼层 IP:香港
这个思路不错,版本控制备份很有用
回复

使用道具 举报

累计签到:11 天
连续签到:3 天
灌水成绩
0
141
1345
主题
帖子
积分

等级头衔

ID : 884

测量学徒

积分成就 测量币 : 1345
在线时间 : 0 小时
注册时间 : 2025-11-24
最后登录 : 2026-5-14

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-3-28 14:55:20 | 显示全部楼层 IP:香港
可以的,正好可以用上
回复

使用道具 举报

累计签到:9 天
连续签到:2 天
灌水成绩
4
158
1150
主题
帖子
积分

等级头衔

ID : 859

测量学徒

积分成就 测量币 : 1150
在线时间 : 0 小时
注册时间 : 2025-10-5
最后登录 : 2026-5-15

勋章
UID勋章测量学徒测量员
联系方式
发表于 2026-3-28 03:03:00 | 显示全部楼层 IP:香港
一般都是再IDEA里面用git  , 纯命令行 不会用啊
回复

使用道具 举报

快速回复换一批
感谢楼主,好人一生平安
顶顶顶
路过留名
好贴帮顶
2333333333
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|精密测量技术论坛 ( 桂ICP备2026007449号-1 )|网站地图

GMT+8, 2026-5-15 01:24 , Processed in 0.116638 second(s), 30 queries .

快速回复 返回顶部 返回列表