Rsync sauf les dossiers .svn et leurs sous-contenus?

10

Gérer un dépôt subversion et un nouvel utilisateur qui ne comprenait pas très bien comment cela fonctionnait.

Pour faire court, puisque leur structure locale a été foirée en raison de la copie de dossiers .svn aléatoires, j'ai fait ce qui suit:

  • copié la structure locale dans un dossier appelé staging
  • récursivement supprimé tous les dossiers .svn du répertoire intermédiaire
  • extrait le dépôt dans un "dossier propre"

Maintenant, nous sommes à la dernière étape - obtenir le contenu du dossier intermédiaire pour écraser le contenu propre.

J'ai besoin qu'une commande copie le contenu du répertoire de transfert dans le répertoire propre, supprimant tout ce qui se trouve uniquement dans le répertoire propre, MAIS laissant les dossiers .svn du dossier propre intact.

Cela ressemble à un travail pour rsync. La commande suivante serait-elle correcte?

rsync -avr --exclude=.svn* [staging] [clean]
SeanKilleen
la source
6
Vous pouvez toujours courir rsyncavec l' --dry-runoption de le découvrir!
Tim
Hahaha Merci! Je ne savais pas que cette option existait. Aurait dû lire l'homme plus attentivement!
SeanKilleen

Réponses:

31

L' -Coption pour rsync peut être ce que vous voulez.

Ne vous laissez pas duper par la courte description de la page de manuel. Il semblerait que l'option ne s'applique qu'à CVS, mais selon votre version de rsync, elle ignorera les fichiers de presque tous les systèmes de contrôle de version courants existants.

# 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
la source
2
Soyez très prudent, car ces extensions peuvent être utilisées pour les fichiers que vous souhaitez copier, par exemple. *.aest pour les bibliothèques statiques iOS.
Max Chuquimia
NB les fichiers et répertoires sont exclus: tout dossier appelé "core" n'est pas copié par exemple / myproj / api / / myproj / core / <- pas sauvegardé!
teknopaul
7

Presque - cela devrait être

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

ou toute autre forme de citation qui empêche le shell d'étendre le caractère générique. (Le caractère générique ne correspondrait qu'à un fichier improbable dont le nom commence par --exclude=.svn, mais il vaut mieux ne pas prendre de risque, et également fonctionner correctement même si le shell est configuré pour s'étouffer avec des caractères génériques non correspondants ou pour les étendre à la liste vide. )

-rest déjà inclus dans -a. Le supplément rest juste superflu, il ne fera aucun mal.

--excludefait que les fichiers correspondant à son argument ne sont ni copiés, ni pris en compte pour une traversée récursive. La difficulté habituelle avec rsync va dans l'autre sens, à l'exclusion d'un répertoire sauf pour certaines parties de celui-ci. Voir Filtre Rsync: copier un seul motif pour quelques conseils.

Dans ce cas particulier, l' exclusion des répertoires de contrôle de version est un moyen rapide d'obtenir ce que vous voulez.

Gilles 'SO- arrête d'être méchant'
la source