多设备项目代码同步
先讲需求。我有 4 台电脑,按使用频率排序分别是台式电脑、联想笔记本、微软 Surface Pro7 和迷你主机。台式机占据了 95% 的使用时间,用于日常办公和开发;迷你主机用于长时间运行且低性能要求的任务;笔记本和 Surface 则用于外出携带。为了实现跨设备的无缝工作流,需要高效同步代码和文件。
目前,OneDrive 已完全满足除代码外的文件实时同步需求,特别是在 Windows 11 环境下。但代码同步始终存在问题。
OneDrive 同步代码的局限
我的代码分为两类备份:
- Code文件夹:存储零散的原型代码,OneDrive 同步表现良好。
- CodeSpace文件夹:存储系统性项目代码,包括科研原型、小型项目和开源代码。这类代码同步存在以下问题:
- 同步慢。JavaScript/TypeScript 的
node_modules
文件夹往往巨大且文件层级深,这会让云盘同步机制捉襟见肘。每个小文件都需要单独上传、处理和版本控制。 - 冲突多。当在多设备间频繁切换修改时,文件锁和冲突的概率大幅提升。OneDrive 会生成文件名 - 冲突副本,而我还需要花时间手动对比和解决。
- 完整性风险。在频繁修改的开发场景下,云盘可能因为未完成同步或网络中断导致文件损坏。直接同步源码文件容易出现版本冲突问题,特别是当多个设备同时访问和编辑代码时。
- 环境依赖问题。将代码直接放在云盘,只解决了代码的「搬运」问题,但没有解决运行环境的迁移。切换设备后,仍需手动重建环境、安装依赖库等。
- 同步慢。JavaScript/TypeScript 的
同步网盘,比如坚果云官方建议,不要使用坚果云同步代码,用 git。但 git 是版本控制工具,又不是同步工具,代码可以托管平台,但快速迭代中频繁 push/pull 既麻烦又低效。同时,项目临时文件无法轻松清理,增加版本库体积。这些所有问题在我快速迭代代码或者开发大型项目时尤其明显。因此,现有方案无法满足 CodeSpace 文件夹的复杂需求,亟需新的同步方案。
选择 VHDX + 云盘同步动机
VHDX 是一种虚拟硬盘文件,可以把它看作一个独立的硬盘设备。把项目的所有代码、依赖环境和一些开发工具(比如常用的脚本和测试数据)都存放在 VHDX 文件里。这样,所有内容都集中在一个文件中,从而实现以下效果:
- 避免同步大量小文件的低效问题,只需同步一个大文件。
- 所有代码和相关依赖都存储在 VHDX 中,无需担心遗漏关键文件。
- VHDX 的整体备份非常方便,可以直接复制到外部硬盘或另一个云盘服务。
- VHDX 本质上是虚拟硬盘,可以用作块存储的抽象层,持差分磁盘文件,这使得它可以结合块级同步技术,例如存储级快照和增量同步
- VHDX 可以存放任何特定于项目的目录、文件和包缓存。在你切换设备时,只需挂载同步好的 VHDX 文件,设置相同的盘符和缓存路径(如 npm、pip),即可获得完整的项目和环境,无需重新安装依赖。
- VHDX 支持动态扩展,随着数据被写入磁盘,虚拟硬盘文件会增长到其最大大小。
- VHDX 支持最大 64 TB,并针对因停电等问题导致的意外 IO 故障提供更具弹性的保护。
- 如果项目发生严重问题,可以通过 OneDrive 的历史版本功能恢复 VHDX 文件的任意版本。
比如 VHDX 驱动器的目录结构可以设计成:
X:\
├── PythonProjects\
│ ├── ProjectA\
│ ├── ProjectB\
│ └── VirtualEnvs\
├── JuliaProjects\
│ ├── ResearchProject\
│ └── SharedPackages\
├── JavaScriptProjects\
│ ├── FrontendApp\
│ ├── NodeModules\
│ └── Utils\
├── Tools\
│ ├── Scripts\
│ └── Templates\
└── packages\
├── nodejs\
├── npm\
└── pip\
实际使用
Windows 11 新增的开发人员驱动器是一种新形式的存储卷,可用于提高关键开发人员工作负荷的性能。开发人员驱动器在 ReFS 技术基础上构建,采用有针对性的文件系统优化,并且可以更好地控制存储卷设置和安全性,包括信任指定、防病毒配置和对附加筛选器的管理控制。
Windows 设置并导航到系统>存储>高级存储设置>磁盘和卷。可以选择创建开发人员驱动器。系统会提供三个选项:
- 创建新的 VHD - 在新的虚拟硬盘上生成卷
- 调整现有卷的大小 - 创建新的未分配空间以进行构建
- 磁盘上的未分配空间 - 使用现有磁盘上的未分配空间。仅当之前在存储中设置了未分配的空间时,才会显示此选项。
因此,在 Windows 11 中,可以方便的利用开发人员驱动器创建 VHDX。
虽然由于管理虚拟磁盘层的开销,将开发人员驱动器存储在虚拟硬盘 (VHD) 中可能会稍微降低性能。权衡的是,VHD 可以选择格式为 VHDX,为动态调整大小(如果需要高效管理磁盘空间)、移动或备份数据提供了更大的灵活性。VHD 也高度可移植,允许将 VHD 文件传输到其他计算机或备份位置。具体创建 VHDX 的过程不再描述,Windows Learn的讲解简洁明了。
很烦
项目一多 VHDX 占用空间就会很大,而 OneDrive 每次同步 VHDX 时都是全量的,没法增量同步。
考虑到出门基本不会高强度迭代代码,就仅当弄了个新方案来备份项目代码。
2024.12.15 我当时就是个傻逼,这玩意对我没什么用处,还浪费大半天时间了解,我是在哪儿看到 VHDX 可以增量备份的,nmd
Enjoy Reading This Article?
Here are some more articles you might like to read next: