удалить .gitignored файлы с помощью rsync

Мне часто нужно использовать rsync для синхронизации локального с возможным удаленным каталогом, в то время как игнорирование точно всех файлов git игнорируется из-за его конфигурации .gitignore.

Для этого в настоящее время я перечисляю все файлы, относящиеся к копированию с помощью git, а затем передаю их в rsync.

cd $source { git ls-files -coz --directory --exclude-standard printf '.git\0' } | rsync --info=progress2 -ar0 --files-from=- ./ "$destination" 

Оставляя синтаксический анализ git сам, а затем прокладывая список файлов в rsync, есть некоторые преимущества, от которых я зависим.

  • Шаблоны для игнорирования файлов могут быть довольно сложными, также включая отрицание ( !inverse-pattern-to-include ), которое rsync не понимает в этом синтаксисе.
  • .gitignore файлы, размещенные в подкаталогах, также должны быть приняты во внимание. Фильтр merge-dir Rsync не позволяет полностью переделать это, потому что для rsync порядок включает и исключает вопросы.
  • Также рассматриваются глобальные конфигурационные файлы git, такие как .git/info/exclude .
  • Он может работать даже без инициализации git-репозитория, просто нужно указать git на пустой репозиторий с помощью --git-dir .
  • Хранилища могут быть довольно большими, поэтому указание всех соответствующих файлов как --filter rsync --filter или --filter ограничения командной строки или серьезному замедлению rsync. Использование --files-from позволяет избежать этого.

Теперь мне нужно улучшить этот фрагмент кода, чтобы поддерживать флаг --del rsync, чтобы удалить все файлы из $destination , которые отсутствуют или исключены из $source . К сожалению, это не очень хорошо работает с --files-from . Возможно ли это без лишнего сравнения списков файлов с обоих концов?

Linux и Unix - лучшая ОС в мире.