Unison 失败并出现 "ill-formed message" 错误,相同的远程和本地版本

Unison fails with "ill-formed message" error, same remote & local versions

升级到 Mac OS X Catalina 后,我正试图让 unison 工作。不幸的是,macports 安装了更新版本的 ocaml (4.08.1),这意味着 unison 2.51.2 版本无法编译。

好吧,那没问题,我只是同步更新到 git master,然后重新编译。不幸的是,这在同步时失败了,因为用于在 mac (4.08.1) 上编译的 ocaml 版本与用于在另一个 machine (4.07.1) 上编译的版本不同。叹。好的,使用 opam magic 在我的 machine 上安装 4.07.1。一切都应该没问题,对吧?没有!

这是错误:

Connected [//zzzmyhost//home/clements/unison-home -> //zzzmyotherhost//Users/clements/clements]
Looking for changes
Uncaught exception Failure("input_value: ill-formed message")
Raised at file "/private/tmp/unison/src/lwt/lwt.ml", line 126, characters 16-23
Called from file "/private/tmp/unison/src/lwt/generic/lwt_unix_impl.ml", line 102, characters 8-23
Called from file "/private/tmp/unison/src/update.ml" (inlined), line 2105, characters 2-69
Called from file "/private/tmp/unison/src/uitext.ml", line 978, characters 16-56
Called from file "/private/tmp/unison/src/uitext.ml", line 1066, characters 6-90
Called from file "/private/tmp/unison/src/uitext.ml", line 1088, characters 19-66
Called from file "/private/tmp/unison/src/uitext.ml", line 1144, characters 21-43

怎么回事?

唉...这里的问题(非常不明显)实际上是 corrupted/wrong-format 同步文件,在较早的测试中执行失败的同步时创建。

解决方案只是进入 ~/Library/Application Support/Unison(在 UNIX 机器上,此路径可能位于 ~/.unison 中并删除导致问题的存档文件(可能是最新的)。在紧要关头,只需删除所有存档文件并重新开始。

从 Ubuntu 18.04 升级后,我在 Windows 和 Ubuntu 20.04 之间遇到了同样的问题。我在 20.04 中尝试了 Ubuntu 18.04 的二进制文件,但仍然失败,因此不兼容可能是在其中一个依赖项中。

作为 解决方法 我根据 Ubuntu 18.04:

创建了一个 Docker 图像
FROM ubuntu:18.04

RUN apt-get update && apt-get dist-upgrade -y
RUN apt-get install unison -y
RUN useradd martin --home /home/martin

WORKDIR /home/martin
USER martin

docker build -t unison:18.04 .

构建它

然后我给 ~/bin/unison-2.48.4-docker 添加了一个包装器:

#!/bin/bash

docker run --rm -i \
  -v /home/martin/dirtosync:/home/martin/dirtosync \
  -v /home/martin/.unison:/home/martin/.unison \
  --hostname $(hostname) \
  unison:18.04 unison "$@"

设置 --hostname 很重要,因为主机名是存档文件的一部分。

在我的 Windows 机器的配置文件中,我配置了:

servercmd = ~/bin/unison-2.48.4-docker

在我的设置中,有两个 windows 客户端和一个 Ubuntu 18.04 服务器,通过 ssh 连接,问题开始于 Ubuntu 20.04 上的第二个服务器 运行。旧服务器和 windows 客户端都无法与新机器同步。

我的解决方案:将二进制文件从 Ubuntu 18.04 复制到 Ubuntu 20.04 机器中的新目录。这个新文件在新机器上ssh的“authorized_keys”文件中被引用。

到目前为止,unison 2.48.4 一切正常。