delete .gitignored arquivos com rsync

1

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 '.git
cd $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.

  • Os padrões para ignorar arquivos podem ser bastante complexos, também envolvendo negação ( !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.
  • Arquivos de configuração globais do git, como .git/info/exclude , também são considerados.
  • Pode até funcionar sem um repositório git inicializado, basta apontar o git para um repositório vazio com --git-dir .
  • Os repositórios podem ser muito grandes, portanto, especificar todos os arquivos relevantes como rsync --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?

    
por XZS 24.04.2015 / 01:14

0 respostas

Tags