Unison跨Mac与Linux同步失败:无法设置文件时间戳
你遇到的这个报错是Unison在同步过程中,尝试把临时缓存文件的修改时间设为Unix纪元起始的1970年,但Linux系统通常不允许设置这么早的时间,直接导致同步失败。这种情况大多和跨平台文件系统的时间处理差异、Unison的缓存机制有关,给你几个针对性的解决办法:
修改Unison配置,绕过时间校验
打开你的Unison配置文件(一般是~/.unison/[你的同步配置名].prf),添加这两行参数:fastcheck = true times = falsefastcheck=true会让Unison优先用文件内容哈希判断是否需要同步,而非依赖修改时间;times=false则直接跳过修改时间的同步操作,从根源上避免时间设置失败的报错。检查Linux系统的时间设置限制
你可以先手动在Linux机器上测试能否设置早于某个时间点的文件修改时间,执行这两条命令:touch test_temp_file touch -t 197001010100 test_temp_file如果命令执行失败,说明你的Linux系统或挂载的文件系统确实限制了时间范围,那上面的Unison配置调整就更有必要了。
清理Unison的缓存文件
报错里提到的.unison.spdy.xxx.tmp是Unison的临时缓存文件,有时候缓存损坏会导致同步逻辑异常。你可以分别在Mac和Linux机器上删除Unison的缓存目录:# Mac端执行 rm -rf ~/.unison/arcs # Linux端执行 rm -rf ~/.unison/arcs清理完后重新启动同步,大概率能解决缓存导致的异常。
排除无需同步的目录(可选)
看报错发生在node_modules目录下,其实这个目录完全可以通过npm install重新生成,没必要同步。你可以在Unison配置里添加排除规则,减少同步量和出错概率:ignore = Path node_modules更新Unison到最新版本
旧版本的Unison在跨Mac(HFS/HFS+)和Linux(ext系列)文件系统时,可能存在时间处理的兼容性bug。更新到最新稳定版,能解决不少这类历史问题。
内容的提问来源于stack exchange,提问作者Stefano Guerrini




