Se eu executar svn rm file
, o arquivo será removido da cópia de trabalho local.
O que eu faço agora é:
$ cp file file2
$ svn rm file
$ svn ci
$ mv file2 file
Como evito que o svn também exclua o arquivo local ao usar svn rm
?
Se eu executar svn rm file
, o arquivo será removido da cópia de trabalho local.
O que eu faço agora é:
$ cp file file2
$ svn rm file
$ svn ci
$ mv file2 file
Como evito que o svn também exclua o arquivo local ao usar svn rm
?
Respostas:
Você deseja a --keep-local
opção de linha de comando. Isso remove o arquivo do controle de versão sem removê-lo do seu sistema de arquivos.
$ svn rm --keep-local my_important_file
Nota: O --keep-local
único afeta o svn rm
da sua cópia. Outros usuários podem ter sua própria cópia local do arquivo excluída, a menos que haja um conflito entre a cópia local e o repositório devido às alterações que eles fizeram. Este pode não ser o resultado desejado. Veja os comentários abaixo.
Remover um arquivo do SVN sem excluí-lo localmente em nenhum lugar é um problema comum. Um exemplo de destaque é o arquivo .classpath em um projeto Eclipse. Colocar esse arquivo de configuração no SVN é maravilhoso, desde que todas as máquinas usadas no projeto tenham a mesma instalação do Eclipse e Java. Depois que essa condição é violada, as confirmações começam a interromper outros projetos Eclipse. Este é o ponto em que é necessário remover um arquivo do SVN sem excluir o ist em qualquer lugar.
svn rm --keep-local .classpath
faz o trabalho perfeitamente em uma máquina e nesse momento.
O problema é que outras máquinas podem perder esse arquivo (na atualização) ou ressuscitá-lo (na confirmação). A falha do SVN não é manipular --keep-local
no repositório nem propagá-lo para outras cópias de trabalho. Portanto, em todas as outras máquinas acima, o comando deve ser executado - melhor antes de qualquer confirmação ou atualização.
Obviamente, isso funcionará 90%, na melhor das hipóteses. Exclusões e novas versões ocorrerão repentinamente. Minha solução é ter todas as máquinas às quais tenho acesso direto ou indireto,
svn rm --keep-local .classpath
copy .classpath .classpath-nameOfTheMachine
svn add .classpath-nameOfTheMachine
É tão feio que dificilmente seja chamado de "solução". No entanto, sempre permitia reparos rápidos de acidentes posteriores.
Não tenho uma resposta para essa pergunta precisa, mas tenho uma resposta para uma pergunta relacionada, que é como remover todos os arquivos (por exemplo, não um específico) em um diretório do controle de versão sem excluí-los localmente. Esta solução vem de uma implementação científica do Linux.
ls -a .svn
deve mostrar o diretório svn que armazena dados de controle. Simplesmente:
rm -r .svn
irá se livrar deste diretório. Então digitando:
svn status
produzirá um erro 'aviso: este diretório não é uma cópia de trabalho', porque não está mais sob controle de versão.
Eu espero que isso ajude.