ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Obsidian 跨平台同步方案详解:Syncthing、坚果云 WebDAV 与 Git 组合实践

Obsidian 跨平台同步方案详解:Syncthing、坚果云 WebDAV 与 Git 组合实践 1. 为什么 Obsidian 官方同步不是每个人的第一选择以及我在 Mac 和 Windows 之间到底试过什么先说我自己的处境你大概也遇到过类似的情况白天在公司用的是 Windows 台式机晚上回家写作、整理资料用的是 MacBook Air。笔记库从 Obsidian 开始重度使用之后就越来越大图片、PDF 附件、插件配置全都塞在同一个 vault 里。一开始我觉得这不就是个云盘放库文件夹的问题吗结果真正用起来才发现Obsidian 的同步远没有想象的那么简单因为它不是一个数据库软件它底层就是一堆 Markdown 文件加一个 JSON 格式的配置文件目录.obsidian。也就是说你选择的同步方案本质上不是一个笔记同步工具而是一个文件双向同步工具。理解了这一点后面所有方案的对错就都能看明白了。Obsidian 官方确实有 Sync 服务按年付费端到端加密体验也算流畅。但对很多人——尤其是国内用户——有个绕不开的痛点官方服务器在国外同步速度和稳定性看心情。我用过一段时间偶尔会出现改完手机上已经同步电脑上过了几分钟才拉下来的情况这对快速查阅的需求来说很致命。更关键的是它只解决Obsidian 这个软件本身的笔记同步你如果还想把 vault 里的一部分内容共享给其他程序使用或者想用 Git 做版本历史官方同步就帮不上忙。于是我把市面上的主流方案都过了一遍包括 iCloud、坚果云 WebDAV、Syncthing、Git 仓库、甚至百度网盘和移动硬盘手动拷贝。这里面的坑比我想象的多得多。比如 iCloud 在 Windows 上的客户端对大量小文件的同步逻辑非常迷经常出现文件显示已同步但实际内容是空的百度网盘之类的方案会有延迟、文件锁定冲突而且它会扫描文件内容对隐私敏感的人不合适。移动硬盘手动拷贝最安全但每天背着硬盘来回跑本质上就是对意志力的考验。最终我确定了一套组合思路在电脑和电脑之间用 Syncthing 做实时双向同步在电脑和手机之间用坚果云 WebDAV 做备选通道再加上一个不算复杂的 Git 仓库用于版本回滚。这套方案我用了大概四个月中间踩过不少坑也摸清了每种工具的行为边界下面我会把每一步的配置过程、原理和我踩过的坑都展开讲你可以直接照着抄。2. 先弄懂三件事跨平台同步才不会白折腾在讲具体工具之前我得先花点篇幅把前置知识讲透因为我在一开始就是因为没搞清楚这几个基本问题导致方案换了好几轮。第一个问题Obsidian 的 vault 到底由什么构成如果你用文本编辑器打开一个 Obsidian 库会发现里面有 .md 文件、附件文件夹还有一个 .obsidian 配置目录。这个配置目录里存的是你的主题、快捷键、启用的插件列表、工作区布局等。它的问题在于不同操作系统上插件可能会产生不同路径的配置尤其是插件本身如果用了绝对路径同步过去之后就会报错。另外 .obsidian 里面的 workspace 文件记录当前打开的面板布局非常容易冲突因为两台电脑上你打开的标签页不同这个文件会在后台频繁被改写。第二个问题同步工具的冲突处理机制是什么样的文件同步不是把最新的覆盖旧的就完了它要考虑两边同时修改同一个文件的情况。好的同步工具会把冲突文件单独复制一份命名成类似xxx (冲突副本)而不是直接判断谁新就覆盖谁。Obsidian 是一个 Markdown 编辑器它的文件在写入时通常不会锁死所以冲突的概率虽然不高但一旦发生且没有保留副本你的笔记内容就真的丢了。第三个问题文件路径和文件名的系统差异。Windows 的文件路径分隔符是反斜杠macOS 是正斜杠Windows 文件系统对文件名大小写不敏感macOS 默认对大小写不敏感但支持敏感模式Windows 不能创建某些特殊字符命名的文件如包含冒号、问号的文件而 macOS 允许一部分特殊字符。如果你在 Mac 上写了一篇标题带问号的笔记同步到 Windows 上就可能导致文件无法同步甚至同步工具直接报错。这些问题很基础但真的会卡住你很久。这三个问题分别决定了你用什么工具、怎么配置工具、以及出了问题怎么排查。下面进入正题。3. 跨平台同步方案横向对比我实际试过的多种方案与最终结论我先把我折腾过的所有方案列个表然后逐个分析它们为什么行或者为什么不行。这样你可以根据自己的需求直接跳转不用重复踩我踩过的坑。方案同步原理速度稳定性冲突处理费用适合人群Obsidian Sync 官方官方服务器端对端加密同步国内一般较稳但偶尔延迟由官方同步机制处理冲突较少年费约百美元不差钱、不想折腾、不在意延迟的人iCloud苹果云端文件夹同步国内慢在 Windows 上极差会生成冲突副本免费5GB全苹果生态用户且 vault 很小坚果云 WebDAV标准 WebDAV 协议第三方客户端对接国内优秀稳定取决于客户端实现免费版有流量限制需要电脑与手机互通、免费额度够用的人SyncthingP2P 局域网/中继服务器加密同步局域网极快互联网看节点很稳需自己维护有版本控制和冲突副本免费开源愿意折腾、追求实时同步的人Git 仓库GitHub/Gitee增量提交推送取决于平台需手动或半自动提交冲突需手动合并免费需要版本历史、习惯命令行的人移动硬盘手动拷贝物理复制粘贴取决于移动硬盘不会丢数据无自动冲突处理硬盘成本偶尔同步、不追求实时性的人我不推荐 Obsidian 官方 Sync 的原因前面说了国内延迟问题和无版本历史是硬伤。iCloud 在 Mac 上非常好用因为它在 Finder 里是直接显示的但到了 Windows 上的客户端就变成了一个按需下载的文件夹大量 Markdown 小文件会不定时被清除本地缓存你正在 Obsidian 里打开笔记时可能就会碰到内容重新加载的转圈。坚果云主要问题是免费版有每月 1GB 上传和 3GB 下载的流量限制纯文字笔记够用但如果你像我喜欢把图片、PDF 直接往 vault 里塞一个月很容易超。Syncthing 最大的门槛是首次配置稍微有点复杂设置好了之后几乎不用再管。Git 不适合做实时双向同步适合做定期备份和版本历史因为它不会自动推送需要你手动 commit。所以我的结论很明确如果你只在两台电脑Mac 和 Windows之间同步第一优先考虑 Syncthing第二选择是坚果云 WebDAV两者可以组合使用。如果你还涉及手机那就直接上坚果云因为 Syncthing 在 iOS 上不能用安卓上的体验也一般。4. 实战方案一SyncthingMac 和 Windows 实时双向同步的最终选择4.1 Syncthing 的工作原理简述Syncthing 本质上是一个 P2P 文件同步程序。它在两台或多台设备上分别运行一个客户端设备之间通过 TLS 加密通信传输的数据不会经过任何第三方服务器除非你在没有公网 IP 的情况下使用了它自带的 relay 中继服务器。同步的粒度是文件夹级别的你指定一个本地文件夹它会持续监听文件夹内的变更事件一旦有文件新建、修改、删除就立刻把增量数据推送给对面设备。它和网盘方案最本质的区别是双向和实时。网盘是你传上去别人拉下来Syncthing 是两台机器本身就是服务器。这意味着不依赖云端空间不担心容量上限。局域网内同步速度接近磁盘拷贝速度我实测在同一个 WiFi 下一个 50MB 的 PDF 几乎秒同步。跨网络家里和公司同步时如果两台设备都能直接建立连接速度也不错如果有一方网络是严格 NAT 环境Syncthing 会尝试通过中继服务器转发速度就会慢一些但作为笔记同步来说完全够用。4.2 下载与安装去 Syncthing 官网下载对应系统版本即可macOS直接下载 macOS 压缩包解压后把 Syncthing 可执行文件拖到应用程序文件夹。它会以后台进程的方式运行你也可以配置成登录时自启动。Windows下载 Windows 版本解压后运行 syncthing.exe。首次运行会开启一个命令行窗口同时自动打开浏览器管理界面。需要注意一个细节Syncthing 的图形操作界面是基于浏览器的默认地址是127.0.0.1:8384。也就是说它没有传统意义上的客户端窗口所有配置都在浏览器里完成。这个设计虽然看起来简陋但好处是跨平台统一管理不需要学习不同操作系统的界面差异。还有一个非常容易忽略的点Windows 防火墙。第一次运行 Syncthing 后Windows 会弹出防火墙提示一定要勾选允许访问否则其他设备连不上你但你自己看界面一切正常排查起来很让人崩溃。4.3 设备配对Mac 和 Windows 互认的完整过程Syncthing 里面把每台要同步的设备称为设备Device而不是客户端或者节点它通过一个 52 位的随机字符串来唯一标识设备。这个字符串长得像这样ABCDEFG-1234567-HIJKLMN-89ABCDE-FGHIJKL-MNOPQRS-TUVWXYZ-1234567实际配对流程如下在 Mac 上打开 Syncthing 管理界面点击右下角的显示 ID复制这串字符。在 Windows 上打开 Syncthing 管理界面点击添加远程设备把 Mac 的 ID 粘贴进去。Windows 会提示设备 XXXXX 想要连接在 Mac 上确认接受。两台设备建立连接后就能看到对方的设备名称和在线状态。如果你家里和公司在不同的网段跨网络同步时建议把 Syncthing 的发现功能保持默认开启它会通过局域网的广播和全球发现服务器帮设备互相找到对方。如果发现服务器连不上你还可以手动添加对方设备的地址格式类似tcp://192.168.1.100:22000这个我们留到避坑部分细说。4.4 创建共享文件夹让两台电脑的 Vault 保持一致设备配对完成后下一步就是添加共享文件夹。以我的实际 vault 为例我在 Mac 上的路径是/Users/用户名/Documents/我的知识库在 Windows 上路径是D:\ObsidianVault两者名字不同但内容要完全一样。在 macOS 端管理界面里点击添加文件夹文件夹 ID填写一个全局唯一的字符串比如obsidian-vault。这个 ID 在两台设备上必须一致它是 Syncthing 识别同一逻辑文件夹的关键。文件夹路径选择你的 Mac 上的 vault 路径。共享给勾选刚才添加的 Windows 设备。然后在 Windows 端也添加文件夹文件夹 ID填写同样的obsidian-vault。文件夹路径选择D:\ObsidianVault。共享给勾选 Mac 设备。配好后Syncthing 会做一次全量扫描把 Mac 上已有的所有文件传输到 Windows 上。第一次同步数据量大可能需要几分钟后续修改就是增量的几乎无感。4.5 我把 .obsidian 排除掉了没有我的态度与理由这是 Obsidian 用户配置 Syncthing 时最大的纠结要不要同步.obsidian配置目录。我的结论是要同步但不能全盘同步。.obsidian目录里有插件、主题、快捷键、工作区等文件其中workspace.json记录当前打开的标签页布局这个文件在 Mac 和 Windows 上内容不同很正常因为你在不同设备上打开的面板不一样。如果每次同步都让它覆盖你会发现在 Mac 上打开 Obsidian 后Windows 上已经记住的布局会经常被重置。我的做法是把.obsidian目录整体加入同步但在 Syncthing 的忽略规则里排除workspace.json和workspace-mobile.json。忽略规则在文件夹设置的忽略模式里配置语法很简单.obsidian/workspace.json .obsidian/workspace-mobile.json这样插件、主题、快捷键这些设置都能保持同步而每台设备的工作区布局则各自独立。实测下来这个配置在 Mac 和 Windows 上都能稳定使用不会互相打架。如果你使用了一些插件比如 Calendar、Dataview、Excalidraw 等它们的配置一般都存在.obsidian/plugins/插件名/data.json里只要同步整个.obsidian/plugins目录配置就都能带过去。但要留意不同操作系统上插件可能依赖不同的外部命令路径比如 Templater 里我设置了一个 Shell 命令的绝对路径Windows 和 macOS 下就完全不同这个我后续会说怎么处理。5. 实战方案二坚果云 WebDAV手机与电脑互通以及作为备用通道5.1 为什么 Syncthing 流转的文件要和坚果云搭配使用Syncthing 在电脑之间非常好用但它在手机上尤其是 iOS 上的体验并不理想。iOS 上 Syncthing 不是原生应用需要通过第三方客户端或者 Mobius 之类的工具间接实现。我在 iPhone 上试过几种方式要么是后台同步不稳定需要手动打开 App 才能拉取新数据要么是配置复杂到让人放弃。Android 上虽然有官方支持的 Syncthing Android 版但国内安卓后台管理机制太多经常被杀进程同步也不够及时。所以当我想在公司、家里和地铁上都能在手机上查看笔记时我选择坚果云 WebDAV 作为补充通道。本质上的逻辑是让 Mac 和 Windows 通过 Syncthing 保持内容完全一致然后让 Mac 上的 Obsidian 通过 Remotely Save 插件把整个 vault 加密上传到坚果云的 WebDAV 空间手机端再用 Obsidian 的 WebDAV 访问同一份数据。这样手机作为第三态只负责读取不参与双向同步避免了三方同步的复杂性和冲突风险。5.2 坚果云 WebDAV 的配置细节坚果云的 WebDAV 地址是固定的https://dav.jianguoyun.com/dav/。但是要注意这个地址指向的是我的坚果云根目录如果你直接把整个 Obsidian vault 放在根目录会导致文件夹混乱。我的做法是在坚果云里新建一个专门的应用目录举例叫ObsidianBackup然后 WebDAV 地址就改成https://dav.jianguoyun.com/dav/ObsidianBackup。在 Obsidian 里我使用 Remotely Save 这个社区插件它支持 WebDAV、S3、Dropbox 等协议。插件配置页里填远程地址https://dav.jianguoyun.com/dav/ObsidianBackup认证方式使用坚果云账号密码但这里有一个很多人不知道的细节坚果云不允许第三方应用直接使用账户密码进行 WebDAV 认证你要去坚果云官网的安全选项里申请一个应用密码这个密码是一串随机生成的字符串专门给第三方应用用。加密方式Remotely Save 支持端到端加密选项我强烈建议勾选。因为坚果云虽然是国内服务商但笔记内容毕竟是隐私加密后即使云端泄露别人也只能看到乱码。首次配置完成后插件会让你选择仅上传还是双向同步。我在 Mac 上用的是双向同步因为我要在手机上也能看到最新修改。手机端的 Obsidian 同样安装 Remotely Save 插件配置相同的 WebDAV 地址和应用密码这样手机就能拉取最新内容了。要注意的是不要在同一时间在 Mac 和手机同时编辑同一篇笔记Remotely Save 解决不了这种并发冲突它只是后写入的覆盖先写入的。5.3 免费版流量的精打细算坚果云免费版每月上传流量 1GB下载流量 3GB听起来很少但用对场景是够用的。Obsidian 的 .md 文件非常小一篇几千字的笔记也就几 KB撑死几十 KB。如果你不放大量图片一个月上百篇笔记产生的流量也就几 MB 级别。真正吃流量的是 vault 里放的 PDF、扫描件、截图这类附件。我自己的经验是将 vault 里的附件文件夹分成两种一种是笔记必须引用的图片另一种是需要归档但不需要随时同步的大文件。前者放在 vault 内正常同步后者单独放到另一个文件夹不参与 Remotely Save 的同步范围。通过 Remotely Save 插件的忽略路径功能我可以指定哪些子文件夹不同步到 WebDAV这样免费流量完全够用而且手机上仍然能看绝大多数文字笔记。6. 避坑实录跨网连接失败、文件冲突、中文路径解决方案与插件路径差异6.1 跨网络同步失败的最常见原因与排查链路前面提到Syncthing 在局域网内几乎不用配置就能直连但在家里和公司两个不同网络环境之间很可能出现两台设备在 Syncthing 界面里显示已断开的情况。第一次遇到这个问题时我先检查两台设备是否在线然后去服务状态里查看监听端口。Syncthing 默认监听22000/tcp端口用于数据传输21027/udp端口用于局域网发现。问题通常出在公司或家里的路由器开启了 AP 隔离导致设备之间无法互通。这个在路由器后台可以关闭但如果是公司网络你没有管理权限就只能换思路。某一侧的防火墙没有放行 22000 端口。很多系统的防火墙会拦截 Syncthing 的对外连接需要在 Syncthing 的设置里把允许来自网络的连接打开并在系统防火墙中手动放行。NAT 类型太严格。家里是普通宽带公司是大型 NAT 出口两边都是对称型 NATSyncthing 通过中继服务器传输的速度会很慢或者干脆连不上。我最后的解法是在 Syncthing 的操作-设置-连接里找到中继服务器选项并保持启用。同时如果公司网络无法开放端口你可以打开全局发现服务器与中继服务器Syncthing 会通过公开的服务器帮助双方建立间接连接。虽然速度不如直连快但笔记同步完全够了。6.2 文件冲突的现场还原与处理建议用 Syncthing 同步 Obsidian 几个月后你一定会遇到冲突文件尤其在两台电脑同时打开 Obsidian 并快速编辑同一篇笔记的场景下。举个例子我在 Mac 上改了一篇叫《项目周报.md》的笔记还没来得及保存完成Windows 上同一篇笔记也刚刚被另一个进程比如 Obsidian 的自动保存写入了不同内容。Syncthing 检测到两边文件在同一时间点发生了不同修改它的默认行为是把最新的那份当作主文件把另一份复制成项目周报 (冲突副本).md。这个机制本身没有问题但问题在于很多 Obsidian 用户不知道冲突副本是怎么回事看到自己的目录里突然多了一个同名但带括号的文件会误以为是累赘顺手就删了。这其实是把另一份宝贵内容删掉了。正确的做法是打开冲突副本对比两份内容手工合并后再删掉副本。为了避免冲突副本频繁出现我养成了一个习惯Mac 上写完笔记后等待 Syncthing 的已同步状态出现再合上电脑Windows 上打开 Obsidian 时注意看左下角同步状态图标是否从待处理变成已完成。这个习惯不花时间但能显著减少冲突。6.3 中文文件名和特殊字符的同步问题Obsidian 的笔记标题经常是中文文件系统层面几乎没问题但同步过程中会出现一个隐蔽的坑文件夹里如果有文件名同时包含中文和英文冒号在 Windows 上文件系统不允许存在Syncthing 会跳过这个文件并在日志里记录错误。你如果只用 Obsidian 对这个文件做链接跳转它可能显示正常但同步却一直不动。我的建议很简单从源头避免。在 Obsidian 设置里将新建笔记的默认文件名格式改为纯日期加编号或者统一用连接符。这样虽然牺牲了一点点可读性但跨平台兼容性大幅提升。同理避免在笔记标题中使用问号、星号、尖括号、竖线这些非法字符尤其是 Windows 系统下。还有一个冷门但值得注意的问题macOS 的文件系统使用 Unicode NFD 格式存储文件名即分解形式而 Windows 使用 NFC 格式即组合形式。虽然 Syncthing 做了内部处理但极少数文件同步过去后Obsidian 的链接可能失效。遇到这种问题的解决方案是在 macOS 上通过textutil或专门的工具批量把文件名转换为 NFC或者在 Mac 上创建 vault 时尽早决定标准避免大量使用中文标题。6.4 插件路径差异到代码片段再到主题样式的系列兼容方案我用的插件里有 Templater 和 Obsidian Git。Templater 里有一段自定义模板里面调用了系统命令比如在 Mac 上要调用open命令在 Windows 上则是explorer。这类因为系统差异导致的插件问题属于跨平台用户特有的坑。我的处理方式是把插件里所有硬编码的命令路径提取出来统一封装成一个system_command的概念。比如在 Templater 模板里不用具体系统路径而是用 Obsidian 自带的 URI 协议或者函数来判断操作系统再执行不同命令。代码大概是这个思路const isWindows navigator.userAgent.indexOf(Windows) ! -1; const cmd isWindows ? explorer : open;这样模板代码在迁移时就不用改来改去。另一个常见问题是主题字体。Obsidian 的默认字体在两个平台下渲染效果不同Windows 下中文默认显示为微软雅黑macOS 下是苹方排版上会有细微差距。如果你在意视觉效果的一致性可以在主题的 CSS 片段里统一西文字体和中文字体比如指定为 Inter 加上 Noto Sans SC这样两个平台看到的排版就一致了。这个 CSS 片段也可以放进.obsidian/snippets目录会跟随 vault 一起同步。7. 进阶操作把 Git 加入流程给自己留一条版本回滚的退路7.1 版本历史为什么值得多花五分钟配置即使有了 Syncthing 的实时同步我仍然会在每周五下午抽五分钟做一个 Git 提交。原因很简单如果某天我误删了一大段内容或者插件升级后把某个配置文件搞乱了Syncthing 会把错误也同步过去而它的版本控制虽然可以找回旧文件但操作起来不够直观。Git 就不一样了每条提交记录都包含完整的文件历史和清晰的 commit message回滚是命令行一条命令的事。我给 Obsidian vault 配 Git 的思路是直接在 vault 根目录初始化一个 Git 仓库使用 Gitee 作为远程仓库因为在国内访问 GitHub 不稳定而且免费私有仓库无限制。然后写一个简单的 shell 脚本在每周五自动执行git add .、git commit、git push三步操作。macOS 上用 launchd 定时任务Windows 上用任务计划程序两边都配置好之后每周都会自动备份一个版本快照。7.2 避免 Git 仓库内容与 Obsidian 同步冲突的技巧这里有一个关键技巧Git 仓库的.git目录必须加入 Syncthing 的忽略规则否则两台电脑各自的 Git 历史可能会互相覆盖导致 Git 仓库损坏。我在 Syncthing 的忽略规则里加了一行.git这样 Syncthing 不会同步 .git 目录每台电脑上的 Git 历史是独立的只有通过 push/pull 远程仓库的操作来同步代码状态。实测这个配置非常稳定唯一的缺点是如果你在 Mac 上做了 Git 提交想在 Windows 上也看到完整的 commit 历史必须先 pull 一次远程仓库。不过对于每周备份级别的需求来说这完全不是问题。8. 最后的经验总结稳定同步的日常维护清单以及我个人的使用习惯整套方案已经运行了四个月期间遇到过一次问题Syncthing 更新版本后Mac 端的中继连接突然失败导致公司里的 Windows 一直显示离线。我的处理流程是打开 Syncthing 的操作-日志在日志里看到连接超时的错误然后去设置里手动添加了对方设备的地址。问题解决后我就把手动添加设备地址写到维护清单里作为第一排查项。以下是我日常维护的完整清单你可以直接复制成自己的 Checklist打开 Obsidian 前先看一下 Syncthing 管理界面确认两台设备都是已连接状态。如果某一台设备离线先检查系统防火墙是否放行 Syncthing 的端口再检查是否更新过版本导致配置变化。每周五跑一次 Git 备份脚本提交信息写成日期比如weekly backup 2026-01-09。如果手机上通过坚果云看到了缺失的笔记先确认 Mac 上 Remotely Save 插件的同步状态再检查手机端 vault 的远程路径是否正确。每个月检查一次 vault 目录里是否有冲突副本文件发现后立即人工合并。这套方案并不复杂核心思想是一个分层备份的思路Syncthing 负责实时、双向、免打扰的日常同步坚果云 WebDAV 负责手机读取和跨平台兜底Git 负责每周的完整快照和版本回滚。三者各司其职不会互相干扰任何一层出问题其他两层都还能顶上。如果你也是家里 Mac、公司 Windows 的 Obsidian 重度用户按照上面的步骤配置下来应该半天之内就能跑通。真正重要的一点是同步工具只是搬运工你要理解它的工作边界不要让它替你决策哪些文件该同步、哪些文件不该同步。把这些规则想清楚跨平台同步就成了一件完全没有心理负担的事。
返回列表