Я использую rsync через Ansible синхронизировать модуль со следующим определением задачи:
synchronize: src='{{ local_app_path }}/.' dest='{{ remote_app_path }}/' perms=no owner=yes rsync_opts=--delete-after
При выполнении этой задачи генерируется следующая команда:
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/"
Макет моего каталога выглядит следующим образом:
src/
# ...
app/
test/
node_modules/
package.json
provisioning/
# ...
playbook.yml
.rsync-filter
Это мой .rsync-фильтр:
exclude /src/.env
exclude /src/node_modules
Теперь я ожидаю запустить свою задачу синхронизации, и результирующая структура каталогов на сервере будет выглядеть следующим образом (обратите внимание на отсутствующий node_modules
папка):
app/
test/
package.json
Это работает. Однако как только я создаю node_modules
папка на сервере ...
app/
test/
node_modules/
package.json
... и снова запустите синхронизацию, node_modules
-папка снова удаляется с сервера (хотя я исключил ее в своем .rsync-фильтре):
app/
test/
package.json
Я жду node_modules
-папка, которая будет храниться на сервере, потому что она у меня указана в моем .rsync-filter
и я не использую --delete-excluded
вариант.
Как я могу предотвратить удаление моих исключенных файлов / каталогов с помощью rsync?
Большое спасибо за твою помощь! :)
Это -FF
это вызывает вашу проблему. Это останавливает -rsync-filter
файл копируется и, как сказано на странице руководства rsync ...
MERGE-FILE FILTER RULES
...
These per-directory rule files must be created on the sending side because it is the
sending side that is being scanned for the available files to transfer. These rule files may also
need to be transferred to the receiving side if you want them to affect what files don’t get deleted
(see PER-DIRECTORY RULES AND DELETE below).
Важный момент - последнее предложение в этом цитируемом разделе. Изменение -FF
к -F
дает желаемое поведение.
У меня очень похожая проблема, как у автора OP. Вот что я нашел. Но, правда, на себе еще не пробовал. Но должно работать.
TL; DR: я думаю, вам нужно добавить "--exclude=node_modules"
на ваш rsync_opts
с точки зрения Ansible.
Если вы читаете rsync
руководство, вы увидите сводку этих параметров
--delete delete extraneous files from dest dirs
--delete-before receiver deletes before xfer, not during
--delete-during receiver deletes during the transfer
--delete-delay find deletions during, delete after
--delete-after receiver deletes after transfer, not during
--delete-excluded also delete excluded files from dest dirs
Опция --delete-excluded
интересно.
--delete-excluded
In addition to deleting the files on the receiving side that
are not on the sending side, this tells rsync to also delete
any files on the receiving side that are excluded (see
--exclude). See the FILTER RULES section for a way to make
individual exclusions behave this way on the receiver, and for
a way to protect files from --delete-excluded. See --delete
(which is implied) for more details on file-deletion.
но на самом деле он вам не нужен, конечно, за исключением того, что он ссылается на --exclude
вариант, который вам нужен.
--exclude=PATTERN
This option is a simplified form of the --filter option that
defaults to an exclude rule and does not allow the full
rule-parsing syntax of normal filter rules.
See the FILTER RULES section for detailed information on this
option.
Добавить "--exclude=node_modules"
на ваш rsync_opts
.