rsync excluye una carpeta que contiene un subdirectorio .git (--filter)

rsync excluye una carpeta que contiene un subdirectorio .git (--filter)

Quiero hacer una copia de seguridad de varias carpetas. En estas múltiples carpetas quiero excluir todos los directorios que contienen un .gitsubdirectorio. 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 --filterargumento 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 SRCy DEST, por ejemplo:

SRC="./"
DEST="../BACKUP/"

Puedes usar algo como findpara localizar todos .gitlos 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 /.gitcomponentes finales:

find "${SRC}" -mindepth 2 -type d -name '.git' \
    | sed -re 's!/.git$!!g'

Como rsyncestableceremos 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 rsynccomando, 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

información relacionada