解决冲突,支持除少数目录外的所有根目录
Resolve conflicts in favour of one root for all but a few dirs
我正在尝试使用 Unison 在 Windows 上的主机和 Fedora Linux.
上的来宾虚拟机之间同步文件
我希望自动管理所有冲突:
- 默认情况下,必须以有利于主机 (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,然后在 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
规则。
我正在尝试使用 Unison 在 Windows 上的主机和 Fedora Linux.
上的来宾虚拟机之间同步文件我希望自动管理所有冲突:
- 默认情况下,必须以有利于主机 (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,然后在 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
规则。