Quiero hacer una copia de seguridad de varias carpetas. En estas múltiples carpetas quiero excluir todos los directorios que contienen un .git
subdirectorio. Así, por ejemplo, en esta jerarquía de carpetas:
├── gitrepo <-- exclude this completely
| └── .git/...
│ └── file1
└── nogitrepo <-- keep this
└── file2
Ya excluí con éxito todos los directorios .git con --exclude=.git
, pero como todo el contenido de los repositorios locales ya está en el SCM remoto, no quiero incluirlos en mi copia de seguridad.
Soy consciente del --filter
argumento de rsync. Miré la página de manual pero no estoy seguro de que resuelva este problema. Pero soy optimista ya que rsync reúne de antemano una lista de archivos con todos los archivos incluidos.
Entonces, ¿es posible con rsync excluir todas las carpetas que son repositorios de git? ¿Algo así como la regla por directorio para --filter
?
Respuesta1
Configure sus variables SRC
y DEST
, por ejemplo:
SRC="./"
DEST="../BACKUP/"
Puedes usar algo como find
para localizar todos .git
los directorios:
find "${SRC}" -type d -name '.git'
Sin embargo , esto también incluirá ${SRC}/.git
(que se convertirá en y ${SRC}
, por lo tanto, finalmente ignorará "todo")... para evitar ese uso -mindepth 2
:
find "${SRC}" -mindepth 2 -type d -name '.git'
A continuación, retire los /.git
componentes finales:
find "${SRC}" -mindepth 2 -type d -name '.git' \
| sed -re 's!/.git$!!g'
Como rsync
estableceremos su directorio de trabajo en la fuente, también debemos recortar la inicial ${SRC}
de los resultados:
find "${SRC}" -mindepth 2 -type d -name '.git' \
| sed -re 's!^'"${SRC}"'!!g;s!/.git$!!g'
Finalmente, une esto con el rsync
comando, usando --exclude-from
, pasando -
(es decir: stdin
):
find "${SRC}" -mindepth 2 -type d -name '.git' \
| sed -re 's!^'"${SRC}"'!!g;s!/.git$!!g' \
| rsync -av --exclude-from - "${SRC}" "${DEST}"/
NOTA:esto no respondecualquierarchivos sin seguimiento/modificados.
Respuesta2
find your_DIR_for_BACKUP -name .git | sed 's/\/.git//g' > ~/exclude_repos
y ejecute rsync con la opción --exclude-from, seleccione el archivo completo ~/exclude_repos
rsync --exclude-from ~/exclude_repos your_DIR_for_BACKUP_SRC DST