unison
定义
unison 是一款面向 Windows 与多种类 Unix 系统(含 Linux、macOS、BSD)的文件同步工具[3]。它把一组文件和目录的两份副本放在不同主机或同一主机的不同磁盘上,允许两者各自被修改,随后通过相互传播改动使双方重新一致[2]。与只做单向镜像的工具相比,它的同步方向是双向的,并且只传输真正变化的部分[1]。
软件以 OCaml 语言实现,源码以 GPL 第 3 版发布,项目由宾夕法尼亚大学的 本杰明·皮尔斯 主导并吸纳外部贡献者[1]。在发行版中通常可以找到提供命令行界面与 GTK 图形界面的软件包[4]。
原理
同步的基本单位是两个“根”(root),即两端需要保持一致的目录路径[5]。unison 在每台主机上维护私有目录,其中归档文件记录了上次同步时各路径的状态;启动后先按目录比对、检查时间戳,发现可疑条目再对文件内容计算指纹并与归档中的记录比较[6]。据项目文档说明,Unix 下的更新检测为求速度采用近似做法,主要看 inode 编号与修改时间,因此可能产生“假更新”,但一般不会漏掉真实改动[6]。
检测完成后,unison 生成一份传播建议清单,把两侧都无法自动判定的条目标记为冲突[1]。若某个路径在两份副本中都被改动(包括一侧删除、另一侧修改),它按“持久性”策略处理:不自行取舍,保留双方内容并报警,由使用者决定[7]。这一行为在皮尔斯与沃永 2004 年的形式化规格中有明确表述,参考实现也经过机器检验[7]。
数据传输沿用 rsync 的块比对思路:目的端先把文件切成固定大小的块,为每块计算弱校验和与强指纹并发送给源端;源端在自己文件中滑动查找匹配块,最终只发送未命中块的数据和指向重复块的编号,从而减少带宽消耗[8]。源码中的阈值设为 700 字节,小于一个块的文件不做块比对而整体传输[9]。
上下文流程可概括如下:
flowchart LR
A[本机根目录] --> C[扫描与更新检测]
B[远端根目录] --> C
C --> D[读取归档状态]
D --> E[生成传播建议]
E --> F{是否存在冲突}
F -- 否 --> G[按建议传播改动]
F -- 是 --> H[标记冲突并等待人工选择]
G --> I[更新归档]
H --> I
发展历程
unison 由宾夕法尼亚大学计算机与信息科学系的研究者推出,1999 年 12 月项目负责人在 Caml 邮件列表中发布了测试版本,当时已可在 Unix 与 Windows 之间同步,并说明核心功能可用但仍有待完善之处[10]。不同资料对首次发布年份的记载略有差异,维基百科词条标注为 1998 年[1]。
此后该软件长期作为类 Unix 发行版的基础工具存在,Debian、Fedora 等都有独立软件包,版本沿 2.40、2.48、2.51、2.52、2.53 逐级推进[2]。长期以来档案格式与通信协议绑定 OCaml 编译器版本,两端必须使用同一版本、同一编译器编译的程序才能工作[4]。
2.52.0 版本引入了新的通信协议、新的归档格式和特性协商机制,使不同版本的 unison 乃至不同 OCaml 编译器版本编译的程序之间可以互操作,并能在保留既有归档的前提下升级[11]。项目方说明,2.52 可能是最后一批支持旧版 OCaml 的发行系列[11]。版本兼容对照表显示,2.52 及以后各版本之间为完全互通,与 2.51、2.48 互通则需 OCaml 版本一致[12]。近年发布节奏延续,2.53.8 于 2025 年 11 月 5 日发布[1]。
应用
最常见的用途是让本地与远程的家目录或常用数据目录保持一致,例如在笔记本与台式机之间同步工作文件[13]。配置以 profile 文件保存,其中列出两个 root、需要同步的 path 子路径以及 ignore 规则,运行指定 profile 名称即可开始同步[4]。
连接方式包括本机路径、经 SSH 隧道访问远端,以及直接用 socket 建立连接,因此可用于局域网或互联网环境[1]。运行时既可交互逐条确认,也可用批处理方式自动传播所有无冲突改动,并跳过存在冲突的文件[1]。命令行界面之外,Windows 与 Linux 上通常提供基于 GTK+ 的图形界面,便于一次勾选多项改动后统一执行[1]。
在较多设备的场景中,常见做法是选取一台主机作为中心,让其余设备分别与它同步,形成星形结构,而不是让每台设备都与所有其他设备配对[14]。冲突处理时可以调用外部合并程序,通过 merge 首选项把文件的两个版本及共同祖先交给 diff3、Emacs ediff 等工具合并。
局限
unison 不是备份工具。删除操作同样会被同步传播,一侧删除文件并经确认后,另一端也会删除,因此无法替代独立备份[13]。项目手册也提示,更新检测在 Unix 上依赖 inode 与修改时间,若人为把时间改回过去,可能被误判为没有变化[6]。
首次同步需要遍历两侧全部文件并计算指纹,耗时明显,在数据量大且链路不稳定的情况下可能触发 SSH 超时;官方建议首次先按子目录分批同步,待归档建立后再整体运行。传输中途若网络中断,程序会保守地删除已传完的部分,重跑时从头开始。
功能层面的限制包括:不识别硬链接;不同步 setuid 与 setgid 位;图形界面为单线程,长时间操作期间窗口不会重绘[6]。重命名被视作“删除加新建”,若被重命名的目录中含有被 ignore 规则排除的文件,这些文件会在传播后被删除[6]。此外,2.52 之前的版本要求两端程序版本与 OCaml 编译器版本一致,跨发行版使用时往往需要手工编译[4]。
参见
参考资料
- Unison (software) [引用日期2026-10-29]
- 软件包:unison(2.48.4-1 以及其他的) [引用日期2026-10-29]
- unison [引用日期2026-10-29]
- Unison [引用日期2026-10-29]
- unison-2.51.2-manual [引用日期2026-10-29]
- unison-manual [引用日期2026-10-29]
- Un scénario classique [引用日期2026-10-29]
- transfer [引用日期2026-10-29]
- transfer [引用日期2026-10-29]
- inria.fr 上的网页 [引用日期2026-10-29]
- Release 2.52.0 · bcpierce00/unison [引用日期2026-10-29]
- github.com 上的网页 [引用日期2026-10-29]
- File Synchronization with Unison [引用日期2026-10-29]
- makeuseof.com 上的网页 [引用日期2026-10-29]