rsync exclui uma pasta contendo um subdiretório .git (--filter)

rsync exclui uma pasta contendo um subdiretório .git (--filter)

Quero fazer backup de várias pastas. Nestas múltiplas pastas, quero excluir todos os diretórios que contêm um .gitsubdiretório. Por exemplo, nesta hierarquia de pastas:

├── gitrepo        <-- exclude this completely
|   └── .git/...
│   └── file1
└── nogitrepo      <-- keep this
    └── file2

Já excluí com sucesso todos os diretórios .git com --exclude=.git, mas como todo o conteúdo dos repositórios locais já está no SCM remoto, não quero incluí-los em meu backup.

Estou ciente do --filterargumento do rsync. Examinei a página de manual, mas não tenho certeza se isso resolverá esse problema. Mas estou otimista, já que o rsync monta previamente uma lista de arquivos com todos os arquivos incluídos.

Então, é possível com o rsync excluir todas as pastas que são repositórios git? Algo como a regra por diretório para --filter?

Responder1

Configure suas variáveis SRC​​e DEST, por exemplo:

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

Você pode usar algo como findlocalizar todos .gitos diretórios:

find "${SRC}" -type d -name '.git'

Isso incluirá ${SRC}/.gittambém (que se tornará ${SRC}e, portanto, ignorará "tudo")... para evitar esse uso -mindepth 2:

find "${SRC}" -mindepth 2 -type d -name '.git'

Em seguida, retire os /.gitcomponentes finais:

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

Como rsyncdefiniremos seu diretório de trabalho como a fonte, precisamos cortar o inicial ${SRC}dos resultados também:

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

Por fim, junte isso com o rsynccomando, usando --exclude-from, passando -(ou seja stdin:):

find "${SRC}" -mindepth 2 -type d -name '.git' \
    | sed -re 's!^'"${SRC}"'!!g;s!/.git$!!g' \
    | rsync -av --exclude-from - "${SRC}" "${DEST}"/

OBSERVAÇÃO:isso não vai pegarqualquerarquivos não rastreados/modificados.

Responder2

find your_DIR_for_BACKUP -name .git | sed 's/\/.git//g' > ~/exclude_repos

e execute o rsync com a opção --exclude-from, escolha o arquivo preenchido ~/exclude_repos

rsync --exclude-from ~/exclude_repos your_DIR_for_BACKUP_SRC DST

informação relacionada