rsync исключает папку, содержащую подкаталог .git (--filter)

rsync исключает папку, содержащую подкаталог .git (--filter)

Я хочу сделать резервную копию нескольких папок. В этих нескольких папках я хочу исключить все каталоги, которые содержат .gitподкаталоги. Например, в этой иерархии папок:

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

Я уже успешно исключил все каталоги .git с помощью --exclude=.git, но поскольку все содержимое локальных репозиториев уже находится в удаленном SCM, я не хочу включать их в свою резервную копию.

Я знаю об --filterаргументе rsync. Я посмотрел на man-страницу, но не уверен, что она решит эту проблему. Но я настроен оптимистично, поскольку rsync заранее собирает список всех включаемых файлов.

Итак, возможно ли с помощью rsync исключить все папки, которые являются репозиториями git? Что-то вроде правила для каждого каталога --filter?

решение1

Настройте переменные SRCи DEST, например:

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

findДля поиска всех .gitкаталогов можно использовать что-то вроде этого :

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

Это будет включать в себя ${SRC}/.gitтакже (что станет ${SRC}, и таким образом в конечном итоге игнорировать "все")... чтобы избежать этого, используйте -mindepth 2:

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

Далее отсоединяем замыкающие /.gitкомпоненты:

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

Поскольку rsyncмы установим его рабочий каталог на источник, нам ${SRC}также нужно будет обрезать начальную часть из результатов:

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

Наконец, соедините это с rsyncкомандой, используя --exclude-from, передав -(т.е.: stdin):

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

ПРИМЕЧАНИЕ:это не подниметсялюбойнеотслеживаемые/измененные файлы.

решение2

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

и запустите rsync с опцией --exclude-from, выберите заполненный файл ~/exclude_repos

rsync --exclude-from ~/exclude_repos your_DIR_for_BACKUP_SRC DST

Связанный контент