Synchronization 解决冲突时,除少数DIR外,所有DIR均采用一个根

Synchronization 解决冲突时,除少数DIR外,所有DIR均采用一个根,synchronization,unison,Synchronization,Unison,我正在尝试使用在Windows上的主机和Fedora Linux上的来宾VM之间同步文件 我希望自动管理所有冲突: 默认情况下,所有冲突都必须以有利于主机(Windows)的方式解决 一些选定的DIR必须以有利于客人(Fedora)的方式解决 这是我的default.prf文件: root = c:\www root = socket://192.168.40.100:9999//home/ben/www # only synchronize these dirs path = site

我正在尝试使用在Windows上的主机和Fedora Linux上的来宾VM之间同步文件

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

  • 默认情况下,所有冲突都必须以有利于主机(Windows)的方式解决
  • 一些选定的DIR必须以有利于客人(Fedora)的方式解决
这是我的
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
目录内外创建冲突文件时,冲突要么全部以来宾的身份解决,要么全部以主机的身份解决

(我已经设置了一个测试脚本,在该脚本中,我创建了包含“主机”或“来宾”内容的冲突文件,启动Unison,然后在Unison完成同步后
cat
这些文件)


我做错了什么?

我在仔细阅读了这些文档,并进行了大量的尝试和错误分析后,终于找到了答案

我的上述配置正常。

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

因此,尽管每次我都用冲突的值覆盖两侧的文件,但我总是将相同的内容(“主机”或“来宾”)写入这些文件。启动时,Unison将文件的内容与其存档进行比较,结果发现,即使修改时间已更新,某些文件的内容仍没有更改:当我向文件写入“主机”或“来宾”时,其中一些文件已具有此值

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

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

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

  • 方法1:通过设置
    ignorearchives=true来忽略启动时的现有存档文件
    ;这是可行的,但启动同步需要5倍以上的时间;或者,删除两侧
    .unison
    目录下的存档也可以
  • 方法2:在执行测试时,确保我向文件写入唯一的内容,以强制Unison将其检测为冲突;为此,我替换了:
    echo "HOST" > site1.com/conflict1
    
    与:
在这两种情况下,Unison现在将文件视为冲突文件,并按预期应用my
Preference
规则

echo "HOST @ $(date)" > site1.com/conflict