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?