如何在 Ubuntu 16.04 xenial 上安装 Unison 2.40(解决“致命错误:收到意外标头”)

如何在 Ubuntu 16.04 xenial 上安装 Unison 2.40(解决“致命错误:收到意外标头”)

在我的树莓派电脑上:

pi@mizu:~ $ unison -version
unison version 2.40.102

在我的桌面 ubuntu 16.04 xenial 上:

kayd@Trunk:~$ unison -version
unison version 2.48.3

尝试同步时:

kayd@Trunk:~$ unison . ssh://pi@mizu/.
...
Fatal error: Received unexpected header from the server:
 expected "Unison 2.48\n" but received "Unison 2.40\n\000\000\000\000\017", 
which differs at "Unison 2.40".

相关帖子1让我安装unison-all,我安装了,但它只包含版本 2.48:

kayd@Trunk:~$ ls -l /usr/bin/unison*
lrwxrwxrwx 1 root root      24 Mai 20 22:15 /usr/bin/unison -> /etc/alternatives/unison
lrwxrwxrwx 1 root root      13 Mär 18 16:10 /usr/bin/unison-2.48 -> unison-2.48.3
-rwxr-xr-x 1 root root 2169968 Mär 18 16:10 /usr/bin/unison-2.48.3
lrwxrwxrwx 1 root root      13 Mär 18 16:10 /usr/bin/unison-latest-stable -> unison-2.48.3

我看到的两个选项:

  1. 找到 xenial 含有 2.40 的 PPA
  2. 为覆盆子找到含有 2.48 的 PPA

到目前为止,两者均未成功。

基于以下用户的回答马皮尔斯271我曾考虑自己编译它,但结果似乎有点像一场噩梦。最后的 在 Unison 开发邮件列表中发帖例如国家“新的 OCaml 4.03 版本对库做了一个小的不兼容的更改。我修复了版本 2.48,以便它可以使用 4.02 或 4.03 进行编译并发布新版本。”“PS,当在运行时遇到可怕的“ocaml 4.02.1 与 ocaml 4.02.2 不兼容”故障时,我还添加了一些希望更好的错误报告。我刚刚这样做了,所以如果您已经抓住了源 tarball 请再做一次。”这让我得出这样的结论:一切都是高度脆弱,如果更新任何内容,即使修订号发生微小变化,也可能会损坏。有许多计算机需要同步,其中一台或另一台会定期更新。

答案1

遇到了一个解决方案:

Debian测试有2.48,应该与Ubuntu版本兼容。您需要在 Pi 上添加测试存储库,但优先级较低(因此只有在明确请求时才会使用该存储库)。

添加以下行/etc/apt/preferences(如果文件尚不存在则创建该文件):

Package: *
Pin: release o=Raspbian,a=stable
Pin-Priority: 500

Package: *
Pin: release o=Raspbian,a=testing
Pin-Priority: 300

然后将以下行添加到/etc/apt/sources.list

deb http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi

现在运行:

sudo apt-get update
sudo apt-cache policy

确认测试存储库(刚刚添加的存储库)的优先级低于其他存储库。

最后:

sudo apt-get install -t testing unison-all

这在 Pi 上给了我 2.48,我能够连接和同步。


您还可以与现有版本一起安装 Unison 的显式版本。跑步

sudo apt-cache search unison

要查找提供的版本,然后安装您选择的版本,例如:

sudo apt-get install -t testing unison2.40.102

带有版本号的软件包是实际的软件包。unison是一个始终依赖于最新版本的元包,而unison-all是一个依赖于版本选择的元包。

如果服务器上有多个版本,则可能需要使用以下-addversionno选项运行 Unison: 这样做会导致客户端将其版本号发送到服务器,并告诉服务器运行相同版本而不是默认版本。


或者,您可以在 Ubuntu 桌面上尝试类似的操作。你需要:

  • 查找在您的 Pi 上提供 Unison 版本的发行版。
  • 将该版本的存储库添加到/etc/apt/sources.list. (复制当前版本的行,然后更改版本名称 - 它是形容词,例如xenialXenial Xerus。)
  • 相应修改etc/apt/preferences。使用您当前的版本名称和具有所需 Unison 版本的版本,而不是stable和。testing您当前的版本具有更高的500优先级。
  • 请务必运行sudo apt-get update; sudo apt-cache policy并验证输出以确保正确设置优先级。否则你可能会弄乱你的 Ubuntu 安装!
  • 当您确定一切正常后,安装unison(或unison-all显式版本),选择您的新存储库。

或者抓取.deb文件并直接安装。

答案2

是的,您运行的 Unison 版本必须相同。这是因为 Unison 用于跟踪内容的存档文件的格式在每个新版本中都得到了改进和更改。

为什么不直接从源代码安装 Unison?我建议在你的树莓派上安装 2.48。你可以下载源码齐奏 2.48.3 在这里,并查看有关如何操作的说明在这里编译并安装。事实上,我建议在运行 Ubuntu 的桌面上从源代码编译并安装 Unison。这样,如果 Ubuntu 决定更新其 Unison 软件包,您将避免任何意外的问题,并且您还可以确保它们都使用相同版本的 OCaml 进行编译,这在之前一直是一个问题。

同样重要的是要注意,您可能必须编译为字节码而不是树莓派上的本机代码。您可以通过Native=false在 Makefile 中进行设置来完成此操作。看我的在这里回答了解更多信息。

答案3

您还可以安装

unison-all

并按照中所述自动选择正确的版本

如何在一个系统上使用多个版本的unison?

答案4

对于我来说,同步 Unix 计算机(Debian Jessie)与 2.40.102 Unison 版本(从 apt-get 的官方稳定包版本安装)和具有最新 2.48.15 版本的 macOS 计算机也存在同样的问题。

最好的解决方案是将 Unison 的 macOS 版本降级到 2.40。二进制在这里:

Union 2.40.61 (GUI) 适用于 macOS Intel

并且不要忘记从“Unison”菜单 >“安装命令行工具”安装命令行。

同步时,它将替换警告:

Unison[16276:318574] Calling nonGuiStartup
Fatal error: Received unexpected header from the server:
expected "Unison 2.40\n" but received "Unison 2.48\n\000\000\000\000\017",
which differs at "Unison 2.48".

经过 :

Unison[18574:332371] Calling nonGuiStartup
Connected [//SERVER.IP//Users/USer/Desktop/Unison -> //localhost//home/user/test]
Looking for changes Warning: No archive files were found for these roots…

注意:我使用的是 macOS Sierra 10.12.4,Unison 2.40.61 似乎运行良好。

相关内容