防止 rsync 删除排除的目录

Mac*_*cks 5 unix deployment rsync ansible

我通过 Ansible 的同步模块使用 rsync和以下任务定义:

synchronize: src='{{ local_app_path }}/.' dest='{{ remote_app_path }}/' perms=no owner=yes rsync_opts=--delete-after
Run Code Online (Sandbox Code Playgroud)

运行此任务会生成以下命令:

rsync --delay-updates -FF --compress --archive --no-perms --rsh 'ssh  -S none -o StrictHostKeyChecking=no' --rsync-path="sudo rsync" --delete-after --out-format='<<CHANGED>>%i %n%L' "../src/." "vagrant@192.168.55.55:/var/www/app/"
Run Code Online (Sandbox Code Playgroud)

我的目录布局是这样的:

src/
    # ...
    app/
    test/
    node_modules/
    package.json
provisioning/
    # ...
    playbook.yml
.rsync-filter
Run Code Online (Sandbox Code Playgroud)

这是我的 .rsync 过滤器:

exclude /src/.env
exclude /src/node_modules
Run Code Online (Sandbox Code Playgroud)

现在我期望运行我的同步任务并在服务器上生成的目录结构如下所示(注意丢失的node_modules文件夹):

app/
test/
package.json
Run Code Online (Sandbox Code Playgroud)

这有效。但是,一旦我node_modules在服务器上创建了一个文件夹......

app/
test/
node_modules/
package.json
Run Code Online (Sandbox Code Playgroud)

...并再次运行同步,该node_modules文件夹再次从服务器中删除(即使我已将其排除在 .rsync-filter 中):

app/
test/
package.json
Run Code Online (Sandbox Code Playgroud)

我希望 -node_modules文件夹保留在服务器上,因为我已将其列在我的列表中.rsync-filter并且没有使用该--delete-excluded选项。

如何防止我的排除文件/目录被 rsync 删除?

非常感谢你的帮助!:)

Pau*_*ane 2

这就是-FF导致你的问题的原因。这会阻止-rsync-filter文件被复制,正如 rsync 手册页所说......

\n\n
MERGE-FILE FILTER RULES\n       ...\n       These per-directory rule files must be created on the sending side because it is the\n       sending side that is being scanned for the available files to transfer. These rule files may also\n       need to be transferred to the receiving side if you want them to affect what files don\xe2\x80\x99t get deleted\n       (see PER-DIRECTORY RULES AND DELETE below).\n
Run Code Online (Sandbox Code Playgroud)\n\n

重要的一点是引用部分的最后一句话。更改-FF-F给出所需的行为。

\n