Rsync excepto las carpetas .svn y sus subcontenidos?

10

Tratar con un repositorio de subversión y un nuevo usuario que no entendía cómo funcionaba.

En pocas palabras, dado que su estructura local estaba en mal estado debido a la copia aleatoria de carpetas .svn, hice lo siguiente:

  • copiado la estructura local a una carpeta llamada puesta en escena
  • borró recursivamente todas las carpetas .svn del directorio provisional
  • desprotegido el repositorio a una "carpeta limpia"

Ahora estamos en el último paso: obtener el contenido de la carpeta provisional para sobrescribir los contenidos limpios.

Necesito que un comando copie el contenido del directorio provisional en el directorio limpio, eliminando todo lo que solo está en el directorio limpio, PERO dejando intactas las carpetas .svn de la carpeta limpia.

Esto suena como un trabajo para rsync. ¿Sería correcto el siguiente comando?

rsync -avr --exclude=.svn* [staging] [clean]
SeanKilleen
fuente
66
¡Siempre puedes correr rsynccon la --dry-runopción de averiguarlo!
Tim
¡Jajaja gracias! No tenía idea de que esa opción existía. ¡Debería haber leído al hombre más cuidadosamente!
SeanKilleen

Respuestas:

31

La -Copción para rsync puede ser lo que quieras.

Sin embargo, no dejes que la breve descripción en la página del manual te engañe. Parece que la opción solo se aplica a CVS, pero dependiendo de su versión de rsync se saltará los archivos de casi todos los sistemas de control de versiones comunes existentes.

# 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
fuente
2
Tenga mucho cuidado, porque estas extensiones pueden usarse para archivos que desea copiar, por ejemplo. *.aes para bibliotecas estáticas de iOS.
Max Chuquimia
Los archivos y directorios NB están excluidos: cualquier carpeta llamada "core" no se copia, por ejemplo, / myproj / api / / myproj / core / <- ¡no se realiza una copia de seguridad!
teknopaul
7

Casi - esto debería ser

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

o cualquier otra forma de cita que evite que el shell expanda el comodín. (El comodín solo coincidiría con un archivo poco probable cuyo nombre comienza --exclude=.svn, pero es mejor no correr el riesgo y también funcionar correctamente incluso si el shell está configurado para ahogarse con comodines no coincidentes o expandirlos a la lista vacía. )

-rya está incluido en -a. El extra res simplemente superfluo, no hará ningún daño.

--excludehace que los archivos que coinciden con su argumento no se copien ni se consideren para un recorrido recursivo. La dificultad habitual con rsync es otra, excluyendo un directorio, excepto ciertas partes del mismo. Consulte Filtro Rsync: copiar un patrón solo para obtener algunos consejos.

En este caso particular, excluir los directorios de control de versiones es una forma rápida de obtener lo que desea.

Gilles 'SO- deja de ser malvado'
fuente