Syncthing配了版本控制却不生成历史版本,覆盖的旧文件去哪找回
两台机器用 Syncthing 同步同一个文件夹(不少人是用 docker 在 NAS 上部署的),怕文件改坏找不回,专门配了"简易版本控制"。真出了事——文件被同步覆盖、被误删——翻遍目录也找不到历史版本,.stversions 文件夹压根不存在。开关明明打开了,为什么一点都不生效?
原因分析
Syncthing 的版本控制不是全局开关,而是每个文件夹、每台设备各自独立设置,且历史版本只在"变更从别的设备同步进来"时才生成:另一台机器上的修改、覆盖、删除传到本机,本机才会把旧文件挪进同步目录下的 .stversions 隐藏文件夹留底。三个高发的失效点:一是版本控制只开在了其中一台机器上,而文件恰恰是在另一台被覆盖的;二是在本机删除本机文件,本机不会留版本,留底出现在对端机器的 .stversions 里;三是 docker 部署时配置卷没有映射出来,容器一重建,版本控制设置跟着清零,页面上看还是"无"。
分步解决
- 核对开关开在哪台机器上:逐台打开 Syncthing 网页界面,进入 文件夹 → 编辑 → 文件版本控制,确认两端(或多端)的同一个文件夹都选了"简单式"或"回收站式",而不是只在一头开。想让哪台留历史,哪台就必须自己开。
- 确认设置真的保存住了:docker 部署的先检查配置卷映射是否还在——容器重建后配置丢失是高发坑;网页界面里改完保存后退出重进一次,看设置有没有弹回"无"。“简单式"填保留份数(别填 1),“回收站式"填清理天数(别填太短)。
- 找对历史版本的存放位置:.stversions 在同步目录根下,是点开头的隐藏文件夹。Windows 要在资源管理器勾选"隐藏项目"才看得见;docker 部署的要到宿主机映射出来的目录里找(SSH 上去看),别用"备份"当关键词满盘搜索。
- 用正确的方法做验证:在本机删文件,本机不会生成历史版本——正确的测试是在另一台机器上改名或覆盖一个测试文件,然后回到这台机器的 .stversions 里看有没有出现旧版本。出现了,机制才算打通;没出现,回到第一步查两端设置。
- 找回文件的操作:把 .stversions 里对应文件拷回同步目录即可,简单式留下的版本文件名带时间戳,恢复时把时间戳后缀去掉;多份历史按时间挑近的。恢复后留意同步状态,等两端一致再继续改。
预防
版本控制是"同步出事后的后悔药”,不能当备份用:两端都开、保留份数给足,并且每季度抽一个旧版本真实恢复一次,确认这条退路随时能走。docker 部署的在做镜像大版本升级前,把配置目录和 .stversions 一起打包再动手。