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 entendeu muito bem como funcionava.

Para encurtar a história, como 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
  • excluiu recursivamente todas as pastas .svn do diretório temporário
  • baixou o repositório para uma "pasta limpa"

Agora estamos na última etapa - fazer com que o conteúdo da pasta de teste substitua o conteúdo limpo.

Eu preciso de um comando para 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 parece um trabalho para o rsync. O comando a seguir estaria correto?

rsync -avr --exclude=.svn* [staging] [clean]
SeanKilleen
fonte
6
Você sempre pode executar rsynccom a --dry-runopção de descobrir!
Tim
Hahaha, obrigada! Não sabia que essa opção existia. Deveria ter lido o homem com mais cuidado!
19412 SeanKilleen

Respostas:

31

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

Não deixe que a descrição curta na página de manual o engane. Parece que a opção se aplica apenas ao CVS, mas, dependendo da sua versão do rsync, ela ignorará os arquivos de quase todos os sistemas de controle de versão comuns 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).
Zoredache
fonte
2
Tenha muito cuidado, porque essas extensões podem ser usadas para arquivos que você deseja copiar, por exemplo. *.aé para bibliotecas estáticas do iOS.
Max Chuquimia 01/07/2014
Arquivos e diretórios NB são excluídos: qualquer pasta chamada "core" não é copiada, por exemplo, / myproj / api / / myproj / core / <- não é feito backup!
precisa saber é o seguinte
7

Quase - isso deve ser

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

ou qualquer outra forma de citação que impeça o shell de expandir o curinga. (O curinga corresponde 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 que o shell esteja configurado para engasgar com curingas não correspondentes ou expandi-los para a lista vazia. )

-rjá está incluído no -a. O extra ré apenas supérfluo, não fará nenhum mal.

--excludefaz com que os arquivos correspondentes ao 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 por certas partes dele. Consulte Filtro Rsync: copiando apenas um padrão para obter algumas dicas.

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

Gilles 'SO- parar de ser mau'
fonte