为何Rsync指定上级路径同步时特定文件夹文件无法同步?
问题根源
这一问题和你使用的--exclude-from参数对应的排除规则直接相关:rsync的排除规则默认以当前执行命令的同步根路径作为相对路径匹配基准,你的两条命令同步根不同,导致同一条排除规则的匹配逻辑发生了变化。
- 第一条命令的同步根是
/opt/projects/web/src/,所有排除规则都相对该路径匹配 - 第二条命令的同步根是
/opt/projects/web/,所有排除规则都相对该路径匹配
举个最简单的例子:如果你的sync_web.exclude文件里写了一条/test/规则,在第一条命令里匹配的是/opt/projects/web/src/test/路径,在第二条命令里匹配的是/opt/projects/web/test/路径,完全是两个不同的目标,很容易出现预期外的排除/包含结果。如果你的规则里同时混用了排除和包含(!开头)的规则,路径基准变化后逻辑失效的概率会更高。
排查方法
直接在无法正常同步的命令前加-nvv参数执行模拟同步,不需要真实同步数据就能看到所有文件的匹配状态:
rsync -nvv -aqe ssh \ --no-g \ --no-p \ --delete \ --force \ --dirs \ --perms \ --no-owner \ --no-group \ --exclude-from="/opt/projects/puppet/devtools/sync_script/support_files/sync_web.exclude" \ --log-file="/tmp/rsync.log" \ /opt/projects/web/ \ "${DEV_IP}":/var/www/
执行后查看输出,未同步的文件如果标记了(exclude),就可以确定是排除规则匹配导致的问题。
解决办法
根据排查到的匹配结果调整sync_web.exclude里的规则,把所有路径改成相对于/opt/projects/web/的写法即可。比如原来针对src目录写的/static/cache/规则,就要改成/src/static/cache/,才能在第二条命令里匹配到正确的路径。
内容的提问来源于stack exchange,提问作者MCLarge
相关产品推荐
相关产品推荐

