解决冲突,支持除少数目录外的所有根目录

Resolve conflicts in favour of one root for all but a few dirs

我正在尝试使用 Unison 在 Windows 上的主机和 Fedora Linux.

上的来宾虚拟机之间同步文件

我希望自动管理所有冲突:

这是我的 default.prf 文件:

root = c:\www
root = socket://192.168.40.100:9999//home/ben/www

# only synchronize these dirs

path = site1.com
path = site2.com

# do not synchronize PHPStorm's config
ignore = Name .idea

# resolve conflicts in favour of the host by default
prefer = c:\www

# resolve directories managed by CLI commands on the guest in favour of the guest

preferpartial = BelowPath site1.com/node_modules -> socket://192.168.40.100:9999//home/ben/www
preferpartial = BelowPath site1.com/public/build -> socket://192.168.40.100:9999//home/ben/www
preferpartial = BelowPath site1.com/var          -> socket://192.168.40.100:9999//home/ben/www
preferpartial = BelowPath site1.com/vendor       -> socket://192.168.40.100:9999//home/ben/www

preferpartial = BelowPath site2.com/node_modules -> socket://192.168.40.100:9999//home/ben/www
preferpartial = BelowPath site2.com/vendor       -> socket://192.168.40.100:9999//home/ben/www

# automatically accept default (nonconflicting) actions
auto = true

# don't keep backup copies
backups = false

# batch mode: ask no questions at all
batch = true

# synchronize continuously (watch for changes)
repeat = watch

以上配置根本不起作用:当我在主机和来宾中创建冲突文件时,在 目录外 preferpartial 目录中,冲突要么全部以有利于客人的方式解决,要么全部以有利于主人的方式解决

(我设置了一个测试脚本,我在其中创建具有 "HOST" 或 "GUEST" 内容的冲突文件,启动 Unison,然后在 Unison 完成同步后 cat 文件)。

我做错了什么?

我在阅读了更多文档并进行了大量的反复试验之后弄明白了。

我上面的配置没问题

我的问题是,每当我 运行 unison 命令时,我希望 Unison 从一个全新的空白状态开始,并且每次都将我的文件检测为冲突。事实并非如此:Unison 保留同步文件的内部 存档,这在像我一样执行测试时可能会产生误导。

所以即使我每次都用冲突的值覆盖两边的文件,我总是向这些文件写入相同的内容("HOST"或"GUEST")。启动时,Unison 正在将文件内容与其存档进行比较,结果发现即使修改时间已更新,某些文件的内容仍未更改:当我给文件写了"HOST"或"GUEST",其中一些已经有这个值

因此在这种情况下,Unison 仅检测到一个方向的变化,因此会将其传播到另一侧,而不是运行解决冲突算法。

我想这是有道理的,也是正常情况下的预期行为。

也就是说,我能够通过两种独立的方式成功验证上面的配置:

  • 方法一:通过设置ignorearchives=true在启动时忽略已有的归档文件;这可行,但启动同步需要多 5 倍的时间;或者,删除 .unison 目录下 两侧 的档案也可以
  • 方法 2:在执行我的测试时,确保我向文件写入唯一的内容,以强制 Unison 将它们检测为冲突;为此,我更换了:
    echo "HOST" > site1.com/conflict1
    
    和:
    echo "HOST @ $(date)" > site1.com/conflict
    

在这两种情况下,Unison 现在都将文件视为冲突,并按预期应用我的 prefer 规则。