rsync excluir de acordo com .gitignore & .hgignore & svn: ignore like --filter =: C

O Rsync inclui uma opção bacana--cvs-exclude para “ignorar arquivos da mesma forma que o CVS faz”, mas o CVS está obsoleto há anos. Existe alguma maneira de fazer isso também excluir arquivos que seriam ignorados pelos sistemas de controle de versão modernos (Git, Mercurial, Subversion)?

Por exemplo, tenho muitos projetos do Maven retirados do GitHub. Normalmente eles incluem um.gitignore listando pelo menostarget, o diretório de construção padrão do Maven (que pode estar presente no nível superior ou em submódulos). Como o conteúdo desses diretórios é totalmente descartável, e eles podem ser muito maiores do que o código-fonte, eu gostaria de excluí-los ao usar o rsync para backups.

Claro que eu posso explicitamente--exclude=target/ mas isso acidentalmente suprimirá diretórios não relacionados que por acaso sejam nomeadostarget e não devem ser ignorados.

E eu poderia fornecer uma lista completa de caminhos absolutos para todos os nomes e padrões de arquivo mencionados em qualquer.gitignore, .hgignoreousvn:ignore propriedade no meu disco, mas isso seria uma lista enorme que teria que ser produzido por algum tipo de script.

Uma vez que o rsync não tem suporte embutido para checkouts do VCS além do CVS, existe algum bom truque para alimentar seus padrões de ignorar? Ou algum tipo de sistema de retorno de chamada em que um script de usuário pode ser perguntado se um determinado arquivo / diretório deve ser incluído ou não?

Atualizar: --filter=':- .gitignore' como sugerido por LordJavac parece funcionar bem para Git como--filter=:C para o CVS, pelo menos nos exemplos que encontrei, embora não esteja claro se a sintaxe é uma correspondência exata.--filter=':- .hgignore' não funciona muito bem para o Mercurial; por exemplo. a.hgignore contendo uma linha como^target$ (o equivalente Mercurial do Git/target/) não é reconhecido pelo rsync como uma expressão regular. E nada parece funcionar para o Subversion, para o qual você teria que analisar.svn/dir-prop-base para uma cópia de trabalho 1.6 ou anterior, e desanime suas mãos para uma cópia de trabalho 1.7 ou posterior.

questionAnswers(10)

yourAnswerToTheQuestion