1

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

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

  • 默认情况下,必须以有利于主机 (Windows) 的方式解决所有冲突
  • 必须解决一些选定的目录以支持来宾(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目录中创建冲突文件时,冲突要么全部解决,要么全部支持来宾,要么全部支持主机

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

我究竟做错了什么?

4

1 回答 1

1

在阅读了更多文档并进行了广泛的反复试验后,我想通了。

我上面的配置没问题。

我的问题是,每当我运行命令时,我都希望 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预期应用我的规则。

于 2019-09-07T13:07:26.263 回答