2

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

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

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

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

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

2 ответа2

0

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

0

Настройте переменные 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}"/

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .