Rsync incluye una opción ingeniosa --cvs-exclude
para "ignorar archivos de la misma manera que lo hace CVS", pero CVS ha estado obsoleto durante años. ¿Hay alguna forma de hacer que también excluya archivos que serían ignorados por los sistemas de control de versiones modernos (Git, Mercurial, Subversion)?
Por ejemplo, tengo muchos proyectos de Maven extraídos de GitHub. Por lo general, incluyen una .gitignore
lista al menos target
, el directorio de compilación predeterminado de Maven (que puede estar presente en el nivel superior o en submódulos). Dado que el contenido de estos directorios es completamente desechable y pueden ser mucho más grandes que el código fuente, me gustaría excluirlos al usar rsync para las copias de seguridad.
Por supuesto que puedo explícitamente, --exclude=target/
pero eso suprimirá accidentalmente directorios no relacionados que simplemente tienen un nombre target
y no se supone que deben ignorarse.
Y podría proporcionar una lista completa de rutas absolutas para todos los nombres de archivo y los patrones mencionadas en cualquiera de .gitignore
, .hgignore
o svn:ignore
la propiedad en mi disco, pero esto sería una lista enorme que tendría que ser producida por una especie de guión.
Dado que rsync no tiene soporte incorporado para las comprobaciones de VCS que no sean CVS, ¿hay algún buen truco para alimentarlo con sus patrones de ignorar? ¿O algún tipo de sistema de devolución de llamada mediante el cual se le puede preguntar a un script de usuario si un archivo / directorio determinado debe incluirse o no?
Actualización : --filter=':- .gitignore'
como sugiere LordJavac, parece funcionar tan bien para Git como --filter=:C
para CVS, al menos en los ejemplos que he encontrado, aunque no está claro si la sintaxis es una coincidencia exacta. --filter=':- .hgignore'
no funciona muy bien para Mercurial; por ejemplo, rsync no reconoce como expresión regular un que .hgignore
contenga una línea como ^target$
(el equivalente Mercurial de Git /target/
). Y nada parece funcionar para Subversion, para lo cual tendría que analizar .svn/dir-prop-base
una copia de trabajo 1.6 o anterior, y levantar las manos consternado por una copia de trabajo 1.7 o posterior.
:-
significa exactamente? ¿Qué significa el colon? ¿Qué diablos?
check-ignore
subcomando que puede lidiar con el arduo trabajo de analizar los distintos archivos "ignorar", si desea utilizar la opción "generar una lista de todos los archivos no ignorados". Mi respuesta aquí da detalles de cómo hacer eso.