Rsync кроме папок .svn и их вложенных файлов?

10

Работа с репозиторием Subversion и новым пользователем, который не совсем понял, как это работает.

Короче говоря, поскольку их локальная структура была испорчена из-за копирования случайных папок .svn, я сделал следующее:

  • скопировал локальную структуру в папку с именем staging
  • рекурсивно удалил все папки .svn из промежуточного каталога
  • проверил репо в «чистую папку»

Теперь мы на последнем шаге - получение содержимого промежуточной папки для перезаписи чистого содержимого.

Мне нужно, чтобы команда скопировала содержимое промежуточного каталога в чистый каталог, удалив все, что есть только в чистом каталоге, НО оставив папки чистой папки .svn в такте.

Это звучит как работа для rsync. Будет ли следующая команда правильной?

rsync -avr --exclude=.svn* [staging] [clean]
SeanKilleen
источник
6
Вы всегда можете запустить rsyncс --dry-runвозможностью узнать!
Тим
Ахахах спасибо! Не знал, что такой вариант существует. Надо было прочитать человека более внимательно!
SeanKilleen

Ответы:

31

-CВариант для Rsync может быть то , что вы хотите.

Не позволяйте короткому описанию на странице руководства обмануть вас. Казалось бы, эта опция применима только к CVS, но в зависимости от вашей версии rsync она пропустит файлы почти всех существующих систем контроля версий.

# rsync version: 3.0.7

-C, --cvs-exclude           auto-ignore files in the same way CVS does

...

          The exclude list is initialized to exclude the  following  items
          (these  initial  items are marked as perishable — see the FILTER
          RULES section):

                 RCS  SCCS  CVS  CVS.adm   RCSLOG   cvslog.*   tags   TAGS
                 .make.state  .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak
                 *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so  *.exe
                 *.Z *.elc *.ln core .svn/ .git/ .bzr/

          then,  files  listed in a $HOME/.cvsignore are added to the list
          and any files listed in the CVSIGNORE environment variable  (all
          cvsignore names are delimited by whitespace).
Zoredache
источник
2
Будьте очень осторожны, потому что эти расширения могут использоваться для файлов, которые вы хотите скопировать, например. *.aдля статических библиотек iOS.
Макс Чукимия
NB файлы и каталоги исключаются: любая папка с именем «core» не копируется, например, / myproj / api / / myproj / core / <- не копируется!
Текнопаул
7

Почти - это должно быть

rsync -av --exclude='.svn*' [staging] [clean]

или любая другая форма цитирования, которая не позволяет оболочке расширять подстановочный знак. (Подстановочный знак будет соответствовать только маловероятному файлу, имя которого начинается с --exclude=.svn, но лучше не рисковать, а также работать правильно, даже если оболочка настроена на засорение несовпадающих подстановочных знаков или развертывание их в пустой список. )

-rуже включен в -a. Лишнее rпросто лишнее, оно не принесет никакого вреда.

--excludeфайлы, соответствующие его аргументу, не копируются и не рассматриваются для рекурсивного обхода. Обычная проблема с rsync заключается в другом, исключая каталог, за исключением некоторых его частей. См. Фильтр Rsync: копирование только одного шаблона для некоторых советов.

В этом конкретном случае исключение каталогов контроля версий - это быстрый способ получить то, что вы хотите.

Жиль "ТАК - перестань быть злым"
источник