rsync 错误“拒绝排除的文件列表”

rsync 错误“拒绝排除的文件列表”

因此,我们最近为我们的网站更新了 2 台生产服务器和 1 台开发服务器。所有服务器都运行 Ubuntu 20.04。我们还更新了包含 Jenkins 安装的构建服务器。该服务器运行 Ubuntu 18.04。构建服务器仅供内部使用,无法从我们自己的网络外部访问。在构建过程中,我们使用 RSYNC 将所有文件复制到生产/开发服务器上的正确位置。

需要澄清的是,我不是 Linux 专家,因此我下面陈述的内容和我所做的故障排除都是来自谷歌搜索以及对 Linux 工作原理的有限了解。

这是我们使用的 rsync 命令:

rsync -rltDv  --chmod=ug=rwX,o=rX -e ssh --exclude-from='exclude-list.txt' --delete --filter='protect wordpress/.htaccess' --filter='merge protect-list.txt' ./ jenkins@${WEB_SRV_ADDRESS}:/var/www/test

这是我们得到的错误:

ERROR: rejecting excluded file-list name: wp-content/plugins/[plugin name]
       /[subfolder]/[subfolder]/[subfolder]/.gitkeep
rsync error: protocol incompatibility (code 2) at flist.c(912) [receiver=3.1.3]

使用的 rsync 版本:

  • 生产和开发服务器(Ubuntu 20.04)> 3.1.3 协议版本 31(最新)
  • 构建服务器(Ubuntu 18.04)> 3.1.2 协议版本 31(最新)

我目前尝试过的方法及其结果
(每次测试后我都会将一切恢复到原始状态)

  • 将 rsync 的构建服务器版本降级至 3.1.1
    • 仍然错误
  • 将 rsync 的生产版本和开发版本降级至 3.1.2
    • 仍然错误
  • 返回构建服务器以进行更新前的备份
    • 仍然错误
  • 将开发服务器恢复到更新前的备份
    • 解决了错误。但奇怪的是,更新前后 rsync 的版本相同。这让我思考了一下,并确认在更新的软件包中,rsync 不是要更新的内容之一
  • 将错误信息中提到的.gitkeep文件更改为php文件
    • 新的错误消息
    • ERROR: rejecting excluded file-list name: wp-content/plugins/[plugin name]/
      [subfolder]/[subfolder]/[subfolder]/test.php
      
  • 尝试删除错误消息中提到的 .gitkeep 文件
    • 将错误移动到下一个包含 .gitkeep 文件的文件夹

据我在线查找到的信息,出现协议错误是因为 rsync 向终端回显了一条错误消息,因此终端不是“干净的”。

经过两天的搜索,我完全没有主意了。希望这里有人能认识到这个问题或为我提供一些想法。

[**编辑-exclude-list.txt 的内容**]

cache/*
/.git
/.gitkeep
/.gitignore
/.gitmodules
/node_modules
/composer.json
/composer.lock
/Jenkinsfile
/gulpfile.js
/package.json
/package-lock.json
/protect-list.txt
/vendor
/get-composer.sh
/exclude-list.txt
wordpress@tmp
api-v2@tmp
/vite.config.js

[**更新-添加了调试信息**]

[receiver] hiding directory folder1/folder2/folder3/folder4/folder5/folder6 because of pattern folder1/folder2/folder3/folder4/folder5/folder6/  
[receiver] send_msg(3, 107)  
[generator] send_msg(3, 107)  
ERROR: rejecting excluded file-list name: folder1/folder2/folder3/folder4/folder5/folder6

答案1

好的,在搜索了一大堆网络并使用了方便的工具--debug=ALL4(感谢@Meuh)之后,我发现问题不在于排除,而在于受保护。经过反复尝试,最终成功了。

我仍然不知道是什么突然导致了这个问题,但我猜想我的 RSYNC 命令混乱,一开始就是一行错误。更新 Ubuntu 似乎导致系统以略有不同的方式处理 RSYNC 请求,或者至少导致一些虽然不好但可以正常工作的东西中断。

在网上看到“排除文件夹意味着它们不会被发送给接收方,并且会删除不在接收文件夹列表中的文件和文件夹”,这让我坚信我需要一个受保护的列表。但事实似乎并非如此,因为被排除的文件夹将被接收方忽略。我用另一个文件夹进行了一些测试,非常简单,一切都按预期开始工作。

我通过更改此行命令解决了我们的问题:

rsync -rltDv  --chmod=ug=rwX,o=rX -e ssh --exclude-from='exclude-list.txt' --delete --filter='protect wordpress/.htaccess' --filter='merge protect-list.txt' ./ jenkins@${WEB_SRV_ADDRESS}:/var/www/test

对此:

rsync -av --chmod=Du=rwx,Dg=rwx,Do=rx,Fu=rwx,Fg=rwx,Fo=rx,o=rX --filter='merge .rsync-filter' --delete ./ jenkins@${WEB_SRV_ADDRESS}:/var/www/test/

现在我创建了一个如下所示的 .rsync_filter 文件:

- cache
- /.git
- /.gitkeep
- /.gitignore
- /.gitmodules
- /node_modules
- /composer.json
- /composer.lock
- /Jenkinsfile
....
- wp-content/media
- wp-content/uploads
....

最后两行和一堆其他行最初受到保护,但现在被排除。现在一切运行正常,一切都如预期一样

相关内容