Frequentemente preciso usar o rsync para sincronizar um local com um possível diretório remoto, enquanto ignoro exatamente todos os arquivos que o git ignoraria por causa de sua configuração .gitignore.
Para fazer isso, atualmente estou listando todos os arquivos relevantes para copiar com o git e depois canalizá-los para o rsync.
cd $source
{ git ls-files -coz --directory --exclude-standard
printf '.gitcd $source
{ git ls-files -coz --directory --exclude-standard
printf '.git%pre%'
} | rsync --info=progress2 -ar0 --files-from=- ./ "$destination"
'
} | rsync --info=progress2 -ar0 --files-from=- ./ "$destination"
Deixar a análise para se autodefinir e, em seguida, canalizar a lista de arquivos para o rsync tem algumas vantagens das quais dependo.
!inverse-pattern-to-include
), que o rsync não entende nesta sintaxe. .gitignore
arquivos colocados em subdiretórios também devem ser levados em conta. O filtro merge-dir
do Rsync não permite totalmente remodelar isso, porque, para o rsync, a ordem inclui e exclui as questões. .git/info/exclude
, também são considerados. --git-dir
. --filter
--exclude
ou --include
patterns provavelmente rebentará o limite da linha de comando ou diminuirá consideravelmente o rsync. Usar --files-from
evita isso. Agora, preciso melhorar esse fragmento de código para suportar o --del
flag do rsync para remover todos os arquivos de $destination
que estão ausentes ou excluídos em $source
. Infelizmente, não funciona bem com --files-from
. Isso é possível sem comparar novamente as listas de arquivos de ambas as extremidades?