Rsync, exceto pastas .svn e seus sub-conteúdos?

10

Lidando com um repositório de subversão e um novo usuário que não entendia como funcionava.

Para encurtar a história, uma vez que a estrutura local foi confusa devido à cópia de pastas .svn aleatórias, fiz o seguinte:

  • copiou a estrutura local para uma pasta chamada teste
  • recursivamente excluiu todas as pastas .svn do diretório temporário
  • retirou o repo para uma "pasta limpa"

Agora estamos no último passo: obter o conteúdo da pasta de teste para substituir o conteúdo limpo.

Eu preciso ter um comando copiar o conteúdo do diretório temporário para o diretório limpo, removendo tudo o que está apenas no diretório limpo, MAS deixando as pastas .svn da pasta limpa intactas.

Isso soa como um trabalho para o rsync. O seguinte comando estaria correto?

rsync -avr --exclude=.svn* [staging] [clean]
    
por SeanKilleen 19.11.2012 / 18:42

2 respostas

30

A opção -C para o rsync pode ser o que você deseja.

Não deixe que a descrição curta na página man engane você. Parece que a opção só se aplica ao CVS, mas dependendo da sua versão do rsync, ele irá ignorar os arquivos de quase todos os sistemas comuns de controle de versão existentes.

# rsync version: 3.0.7

-C, --cvs-exclude           auto-ignore files in the same way CVS does

...

          The exclude list is initialized to exclude the  following  items
          (these  initial  items are marked as perishable — see the FILTER
          RULES section):

                 RCS  SCCS  CVS  CVS.adm   RCSLOG   cvslog.*   tags   TAGS
                 .make.state  .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak
                 *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so  *.exe
                 *.Z *.elc *.ln core .svn/ .git/ .bzr/

          then,  files  listed in a $HOME/.cvsignore are added to the list
          and any files listed in the CVSIGNORE environment variable  (all
          cvsignore names are delimited by whitespace).
    
por 19.11.2012 / 23:03
4

Quase - isso deve ser

rsync -av --exclude='.svn*' [staging] [clean]

ou qualquer outra forma de cotação que impeça o shell de expandir o curinga. (O caractere curinga corresponderia apenas a um arquivo improvável cujo nome começa com --exclude=.svn , mas é melhor não correr o risco, e também funcionar corretamente mesmo se o shell estiver configurado para bloquear os curingas não correspondentes ou expandi-los para o lista vazia.)

-r já está incluído em -a . O r extra é apenas supérfluo, não causará nenhum dano.

--exclude faz com que os arquivos correspondentes a seu argumento não sejam copiados nem considerados para travessia recursiva. A dificuldade usual com o rsync está indo para o outro lado, excluindo um diretório, exceto para certas partes dele. Consulte filtro Rsync: copiando apenas um padrão para alguns dicas.

Neste caso específico, excluindo a versão diretórios de controle é uma maneira rápida de obter o que você deseja.

    
por 20.11.2012 / 00:39