Я хочу сделать резервную копию нескольких папок. В этих нескольких папках я хочу исключить все каталоги, которые содержат .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