refuge:让 OneDrive 成为私人 Git 仓库的存储层
我用 Beancount 做个人财务管理,用 Git 做版本控制。同时我在 OneDrive 里放了一个 bare Git repo,用它做备份,也用它跨设备同步。
为什么不直接把整个 beancount 工作目录放进 OneDrive?因为我在用的过程中,它会装一些 Python 的 virtual environment 文件,运行时还有 __pycache__ 这种临时文件。这些东西其实完全不需要同步。所以我就在 OneDrive 里放一个 bare Git repo1,用的时候再从这个 bare repo 里创建一个 worktree。
但这个办法的问题是没法做多设备同步。一个 branch 只能有一个 worktree,我如果有两台电脑都想操作这个 repo,就要 checkout 出两个 worktree,非常不方便。
还有一个使用场景是在公司。我有一些自己创建的 Git repo,它们首先不适合放到公司的 Git 平台上;其次,我希望每隔几年换新设备的时候,能很方便地把它们迁移到新电脑上。公司提供了 OneDrive,我就想,能不能让 OneDrive 当存储。
我又不想部署一个私有的 Git host 平台,比如 Gitea、GitLab 这些东西。在公司电脑上部署这个东西有点太重。
所以我开发了 refuge。它是一个 CLI 工具,可以帮你把 OneDrive 变成一个 remote repo 的 storage layer。它只是让我能够正常地操作一个 Git repo,然后自动把这个 repo 放到 OneDrive 里去做备份。我到了新机器上,又能从 OneDrive 的备份里把 repo 恢复出来。这样你在操作这种个人 repo 的时候,就像把数据托管在 GitHub 上一样,你只需要正常地 pull、push 就好了,不需要考虑 worktree、bare repo 这些东西。
使用案例
典型流程是这样:把已经存在的仓库接进来,push 一次,之后正常用 Git。我这套只用在一台电脑上,换机器是靠备份恢复。
# 准备本机:仓库放在本地的 repos 目录,快照写进 OneDriverefuge init --target ~/OneDrive/refuge
# 把自己已有的仓库接进来,并在当前工作副本里加上 refuge 这个 remotecd ~/code/notesrefuge repo import notes --connect
# 之后就是普通的 Git 操作,提交再 push 就好,refuge 会自动把快照写进 OneDrivegit add -Agit commit -m "update notes"git push refuge main
# 看保护状态;snapshots verify 会把快照真正恢复一遍来确认它可用refuge repo status --allrefuge snapshots verify notes换一台机器的时候,仓库从 OneDrive 里恢复:
refuge init --target ~/OneDrive/refugerefuge restore notes