Препятствуйте тому, чтобы rsync удалил исключенные каталоги

Я использую 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

Это работает. Однако, после того как я создаю a node_modules папка на сервере...

app/
test/
node_modules/
package.json

... и выполненный синхронизация снова, node_modules- папка удалена из сервера снова (даже при том, что я исключил его в своем .rsync-фильтре):

app/
test/
package.json

Я ожидаю node_modules- папка, которая будет сохранена на сервере, потому что мне перечислили его в моем .rsync-filter и не использую --delete-excluded опция.

Как я могу препятствовать тому, чтобы мои исключенные файлы/каталоги были удалены с rsync?

Большое спасибо за Вашу справку!:)

3
задан 8 January 2015 в 20:47
2 ответа

-FF -FF является причиной вашей проблемы. Это останавливает копирование файла -rsync-filter и, как сказано в man-странице 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 дает желаемое поведение.

.
1
ответ дан 3 December 2019 в 07:27

У меня очень похожая проблема, как у автора 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 .

0
ответ дан 3 December 2019 в 07:27

Теги

Похожие вопросы