停止全量重复导出:Apple Notes Exporter增量同步完全指南(水印清单、差异历史与删除笔记自动修剪)

发布时间:2026/10/30 7:53:34
停止全量重复导出:Apple Notes Exporter增量同步完全指南(水印清单、差异历史与删除笔记自动修剪)

【免费下载链接】apple-notes-exporter

MacOS app written in Swift that bulk exports Apple Notes (including iCloud Notes) to a multitude of formats preserving note folder structure.

项目地址:https://gitcode.com/gh_mirrors/app/apple-notes-exporter
点击查看免费下载

如果你还在用Apple Notes Exporter做全量重复导出,那么它的**增量同步(Incremental Sync)**功能值得立刻上手:一份藏在输出目录里的水印清单(watermark manifest)会记住每篇笔记的修改时间,下次运行只重写新增和改动的笔记,被删除的笔记还会自动从磁盘上修剪掉,并且每次同步都留下可追溯的差异历史。本文带你从零配好这套机制,覆盖图形界面、命令行、Shortcuts 与 MCP 四种入口。

全量导出有多浪费?先看增量同步的工作方式

备忘录库动辄上千篇笔记时,每次备份都把所有笔记和附件重新写一遍,不仅慢,还让备份目录里的文件时间戳全部刷新。

增量同步的思路很简单:

  • 首次运行:全量导出,并在输出目录生成AppleNotesExportSyncWatermark.json清单,记录每篇笔记的 ID、修改时间和导出路径;
  • 后续运行:对比修改时间,未变化的笔记直接跳过,只导出新增或修改过的笔记;
  • 笔记被删除:对应的导出文件(含附件)从磁盘上删除,目录与 Apple 备忘录保持镜像一致。

修改时间比较时预留了 0.001 秒的容差,避免浮点精度导致的"假变更",详见 SyncManifest.swift。

核心文件:AppleNotesExportSyncWatermark.json 里都有什么

清单就是一个 JSON 文件,放在输出目录根部,结构包含四部分:

字段含义
version清单格式版本,当前为 1
lastSync最近一次同步的时间
notes每篇笔记的 ID → 修改时间、导出路径、附件相对路径
history每次增量运行的文件级差异(added / updated / deleted),最多保留最近 50 次

清单采用原子写入(atomic write),即使导出中途断电也不会留下损坏的文件。相关实现见 SyncManifest.swift。

图形界面:一个开关开启增量同步

打开 App 后,在Step 3: Choose Output Options中勾选Incremental sync即可:

几个值得注意的细节:

  • 开启后,底部的Export按钮会变成Sync,并显示"Last synced X days ago"之类的状态;
  • 界面上会提示 ⚠️Sync will overwrite previously exported files. Apple Notes is the source of truth.—— 备忘录是唯一事实来源,以它为准修剪输出目录;
  • 增量同步只适用于 Folder 目标。ZIP / TAR / Single File 是打包产物,清单无法在两次运行之间持久化,选中这些目标时开关会自动隐藏,CLI 和 MCP 则直接报错拒绝。

导出过程中可以点View Export Log查看逐条进度:

命令行:三条命令搞定增量备份

随 App 附带的 CLI 工具notes-export(位于Apple Notes Exporter.app/Contents/SharedSupport/notes-export)让增量同步天然适合定时任务:

# 首次:全量导出并写入水印清单 notes-export export --output ~/backups/notes --format markdown --incremental # 之后(可放进 crontab):只重写新增/修改的笔记 notes-export export --output ~/backups/notes --format markdown --incremental # 查看同步状态与最近历史,不打开备忘录数据库 notes-export sync-status --output ~/backups/notes # 强制全量重导(先清空清单) notes-export export --output ~/backups/notes --format markdown --incremental --reset-sync

命令定义见 ExportCommand.swift。标准输出是 JSON 便于管道处理,进度与错误走 stderr。

差异历史:每次同步自带"审计日志"

从 v2.1 起,每次增量运行都会向清单的history追加一条记录:运行时间戳 + 本次新增、更新、删除的文件路径列表(文件级,不含笔记内容),上限 50 次防止无限膨胀。sync-status会输出最近 10 次运行的明细,包括每类的文件计数,方便回答"昨天备份到底动了哪些文件"。

实现见 SyncStatusCommand.swift 与历史裁剪逻辑 SyncManifest.swift。

导出日志窗口同样适合复查每一篇笔记和附件的落盘情况:

删除笔记自动修剪:输出目录不再留"僵尸文件"

增量运行结束时会调用pruneDeleted:清单里有、但备忘录库里已不存在的笔记,其导出文件与附件目录会被一并删除。

这里有一个关键设计:修剪的基准是整个备忘录库,而不是本次运行选中的子集。也就是说,你只导出"工作"文件夹到一个已有同步目录,不会把其他文件夹已导出的笔记误判为"已删除"。相关逻辑见 CLIExportEngine.swift 与 ExportSupport.swift。

另一个隐性收益:清单中路径与当前文件夹结构不符的旧条目(比如早期版本误放进 "Unknown Folder" 的笔记、或你后来在备忘录里挪动了文件夹)会被清理并在新位置重新导出,相当于一次自动修复。

自动化入口:Shortcuts 与 MCP 同样支持

  • Apple Shortcuts:Export 动作提供Incremental Sync与Reset Sync参数,另有独立的Sync Status动作,不开数据库即可报告某目录的同步状态,可挂进 Siri 或"个人自动化"。
  • MCP 服务器(notes-export-mcp):export_notes工具支持incremental参数,sync_status工具查询同步状态;应用内Help > Connect to an AI Assistant可一键复制配置。出于安全考虑,MCP 导出只允许写入$HOME或/tmp。

常见坑位与最佳实践

  • 📁只保留 Folder 目标:选了 ZIP / TAR / Single File,增量同步选项会自动消失或被拒绝,这是设计使然;
  • 🧹切换输出格式前先--reset-sync:清单里的路径绑定旧格式的文件名,直接换格式可能造成新旧文件混杂;
  • 🗂️手动导出子文件夹是安全的:修剪按全库判定,不会误删未选中的笔记;
  • 🔐权限:CLI、Shortcuts、MCP 都需要 Full Disk Access 才能读取备忘录数据库,和 GUI 一样;
  • ⏳无变更时也建议定期跑一次:即使没有任何新笔记,引擎仍会检查并修剪已删除笔记、追加历史。

小结

Apple Notes Exporter 的增量同步把"备份"变成了真正的"同步":水印清单记住变更、差异历史留下审计、删除修剪保持目录干净。图形界面一个开关就能用起来,而notes-export的--incremental、--reset-sync和sync-status三条命令足以支撑一套自动化的备忘录备份流水线。完整说明参见 README.md 的Incremental Sync一节。

【免费下载链接】apple-notes-exporter

MacOS app written in Swift that bulk exports Apple Notes (including iCloud Notes) to a multitude of formats preserving note folder structure.

项目地址:https://gitcode.com/gh_mirrors/app/apple-notes-exporter
点击查看免费下载

相关推荐

上一篇:如何快速上手Lemonade:3分钟搭建你的远程剪贴板服务
下一篇:React 360组件复用策略:从封装到发布的完整流程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考