Qual é a maneira correta de restaurar um arquivo excluído do SVN?

119

Excluí um arquivo de um repo e agora quero colocá-lo de volta. O melhor que posso descobrir é:

  • atualizar para a revisão antes de excluir
  • copie os arquivos em outro lugar
  • atualizar para a cabeça
  • copie os arquivos de volta
  • Adicione-os
  • comprometer

Isso cheira mal e perde toda a história para arrancar. Deve haver uma maneira melhor de fazer isso. Já procurei no The SVN Book, mas não encontrei nada e agora estou procurando a lista de tags do SVN.

BCS
fonte
4
Certamente a resposta de tukushan é a resposta direta correta à sua pergunta e deve ser aceita?
James McCormack
@JamesMcCormack: veja o NB em sua resposta.
BCS
2
Uma dica, se você excluiu o arquivo e não fez a alteração ainda, basta clicar com o botão direito e atualizar irá recuperá-lo.
Hammad Khan

Respostas:

57

Use svn merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Então, um exemplo:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Para TortoiseSVN (eu acho ...)

  • Clique com o botão direito no Explorer, vá para TortoiseSVN -> Merge ...
  • Certifique-se de que "Mesclar um intervalo de revisões" esteja selecionado, clique em Avançar
  • Na caixa de texto "Intervalo de revisão a mesclar", especifique a revisão que removeu o arquivo
  • Marque a caixa de seleção "Mesclar reverso" e clique em Avançar
  • Clique em Unir

Porém, isso não foi testado completamente.


Editado por OP : Funciona na minha versão do TortoiseSVN (o tipo antigo sem o próximo botão)

  • Vá para a pasta de onde o material foi deletado
  • Clique com o botão direito no Explorer, vá para TortoiseSVN -> Merge ...
  • na seção De , insira a revisão que fez a exclusão
  • na seção Para , insira a revisão antes de excluir.
  • Clique em "unir"
  • comprometer

O truque é fundir ao contrário . Parabéns a sean.bright por me apontar na direção certa!


Edit: estamos usando versões diferentes. O método que descrevi funcionou perfeitamente com minha versão do TortoiseSVN.

Também digno de nota é que se houver várias mudanças no commit que você está fazendo a fusão reversa, você desejará reverter essas outras alterações uma vez que a fusão seja feita, antes de fazer o commit. Caso contrário, essas alterações extras também serão revertidas.

Sean Bright
fonte
Estou no Windows e não tenho uma versão CLI do SVN. você sabe como fazer com que o ortoiseSVN faça isso?
BCS
O Tortoise tem "mesclar" no menu do botão direito. Ele tem caixas para preencher para o rev. Também "Dry Run" para ver se acertou. E lembre-se, o resultado não conta até que você o confirme. Você pode reverter se tudo der errado.
gbarry
Eu diria que o OP tem uma versão mais antiga do Tortoise. O mais recente tem uma caixa de diálogo de mesclagem diferente (inferior)
1800 INFORMAÇÕES
Ainda estou para ver QUALQUER sistema de mesclagem que não seja ruim. Texto, arquivos, dirs, documentos do Word, eca. Acho que não é um problema solucionável. OTOH coisas podem ser mais ou menos ruins. :)
BCS
1
Se você reverter vários arquivos e depois reverter, uma das reversões é a reversão. Ai! Acho que machuquei alguma coisa.
BCS
176

O problema em fazer um svn merge como sugerido por Sean Bright é que ele reintroduz outras alterações feitas na mesma revisão da exclusão. Uma cópia svn é uma operação mais direcionada que afetará apenas os arquivos excluídos.

Usando o Tortoise SVN você pode ressuscitar um arquivo que foi excluído do diretório da sua cópia de trabalho e de revisões posteriores do SVN, através de uma cópia svn como segue:

  • Navegue até a pasta da cópia de trabalho que continha o arquivo anteriormente.
  • Clique com o botão direito na pasta no Explorer, vá para TortoiseSVN -> Mostrar log.
  • Clique com o botão direito no número da revisão antes da revisão que excluiu o arquivo e selecione "Navegar no repositório".
  • Clique com o botão direito no arquivo excluído e selecione "Copiar para cópia de trabalho ..." e salve.

O arquivo excluído agora estará na pasta da cópia de trabalho. Para adicioná-lo novamente ao SVN, clique com o botão direito do mouse no arquivo restaurado e selecione SVN Commit.

NB: Este método irá preservar o histórico anterior do arquivo restaurado, no entanto, para ver o histórico anterior no log do TortoiseSVN você precisa se certificar de que "Parar ao copiar / renomear" está desmarcado na caixa de diálogo Mensagens de log.

tekumara
fonte
26
Isso também pode ser feito diretamente no servidor, útil se os arquivos ou pastas excluídos forem muito grandes: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig
Esta é a maneira certa de fazer isso. Tentei com TortoiseSVN 1.8.1 e funciona como recomendado.
Dr. Gianluigi Zane Zanettini,
Perfeito!! Simples e eficaz. Obrigado pela solução
Hunter
Este método tornou muito mais fácil restaurar um arquivo em um branch filho que havia sido excluído de seu branch pai. Talvez houvesse uma maneira de fazer isso merge, mas eu não descobri.
chega em
"Apenas antes" na etapa 3 é importante. Na etapa 4, o Tortoise continuou reclamando que o arquivo já existe, embora eu o tenha excluído usando uma exclusão do Windows. Eu tive que atualizar minha cópia de trabalho primeiro. (Meu colega excluiu vários arquivos usando a exclusão do Tortoise, e depois confirmou as alterações.) TortoiseSVN 1.8.1.
leqid de
16

Use a funcionalidade de cópia do Tortoise SVN para reverter as alterações confirmadas:

  1. Clique com o botão direito na pasta pai que contém os arquivos / pastas excluídos
  2. Selecione a opção "mostrar log"
  3. Selecione e clique com o botão direito na versão antes da qual as alterações / excluídas foram feitas
  4. Selecione o "repositório de navegação"
  5. Selecione o arquivo / pasta que precisa ser restaurado e clique com o botão direito
  6. Selecione "copiar para" que irá copiar os arquivos / pastas para a revisão principal

espero que ajude

Mukul Joshi
fonte
13

Sempre pareço usar svn copy como uma operação de servidor, então não tenho certeza se ele funciona com dois caminhos de trabalho.

Aqui está um exemplo de restauração de um arquivo excluído em uma cópia de trabalho local do projeto:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Enquanto estiver dentro do diretório do projeto. Isso também funciona para restaurar diretórios inteiros.

NullPoiиteя
fonte
2
+1 A cópia @ funcionou. A cópia -r não parece funcionar para usar CollabNet svn 1.6.17 no Mac OSX.
Gray
2
Além disso, a revisão usada deve ser a revisão antes da exclusão.
Cinza,
6

Se você está usando Tortoise SVN, você deve ser capaz de reverter as mudanças apenas daquela revisão em sua cópia de trabalho (efetivamente realizando uma fusão reversa), então faça outro commit para adicionar novamente o arquivo. As etapas a seguir são:

  1. Navegue até a pasta na cópia de trabalho onde você excluiu o arquivo.
  2. Vá para o repo-browser.
  3. Navegue até a revisão onde você excluiu o arquivo.
  4. Na lista de alterações, encontre o arquivo que você excluiu.
  5. Clique com o botão direito do mouse no arquivo e vá em "Reverter alterações desta revisão".
  6. Isso irá restaurar o arquivo para sua cópia de trabalho, mantendo o histórico.
  7. Confirme o arquivo para adicioná-lo de volta ao seu repositório.
davogones
fonte
OK, nesse caso, a questão era como fazer o que você acabou de descrever. (Resposta: use mesclar para trás)
BCS
1
Eu estava falando sobre como fazer isso no Tortoise SVN. Vou adicionar mais detalhes.
davogones
5

A maneira mais fácil de restaurar arquivos e não perder o histórico de revisão é usando a cópia SVN . O exemplo de mesclagem acima para mim parece uma maneira mais complexa de fazer a mesma coisa. Por que há necessidade de mesclar quando você simplesmente deseja restaurar uma revisão?

Eu uso o seguinte neste caso e funciona muito bem.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Sempre pareço usar svn copycomo uma operação de servidor, então não tenho certeza se funciona com dois caminhos de trabalho.

Daniel Honig
fonte
3
SVN COPY é a abordagem recomendada. A sintaxe é muito simples: svn copy [SVN URL] @ [REVISION # WHERE FILE EXISTS] [LOCAL PATH TO RESTORE TO] de visualsvn.com/support/svnbook/branchmerge/basicmerging . Só usei isso sozinho.
Amit
Isso faz mais sentido para mim, eu também uso essa abordagem
Dmitry Pashkevich
4

Com Tortoise SVN :

Se você ainda não confirmou suas alterações, pode fazer uma reversão na pasta pai onde excluiu o arquivo ou diretório.

Se você já enviou o arquivo excluído, pode usar o navegador do repositório, mudar para a revisão onde o arquivo ainda existia e usar o comando Copiar para ... no menu de contexto. Insira o caminho para sua cópia de trabalho como destino e o arquivo excluído será copiado do repositório para sua cópia de trabalho.

VonC
fonte
legais. Vou tentar da próxima vez.
BCS
1

Você deve conseguir apenas verificar o arquivo que deseja restaurar. Tente algo como svn co svn://your_repos/path/to/file/you/want/to/restore@revonde revestá a última revisão em que o arquivo existia.

Eu tive que fazer exatamente isso há pouco tempo e se bem me lembro, usar a -ropção de svnnão funcionou; Tive que usar a :revsintaxe. (Embora eu possa ter lembrado ao contrário ...)

David Z
fonte
Não é isso que eu quero. Quero corrigir o arquivo de volta no repo e fazer com que o SVN saiba que é o mesmo arquivo.
BCS