Existe uma maneira de se recuperar de um “svn revert” acidental?

94

Consegui atirar no meu pé esta manhã ao fazer o seguinte:

  1. Comecei a trabalhar em uma mudança no meu projeto
  2. Fez várias edições em vários arquivos
  3. Percebi que minha abordagem estava errada e que precisava começar de novo
  4. cd'd para o nível superior do meu projeto e fez um "svn - reversão recursiva." para restaurar minha sandbox local ao estado anterior às alterações.
  5. Gritei de horror quando percebi que havia uma série de outras mudanças pendentes em minha caixa de areia local, e eu tinha acabado de obliterar todas elas. (o servidor svn estava fora do ar na sexta-feira passada, então não pude fazer o check-in e esqueci-me deles no fim de semana)

Felizmente, neste caso, eu tinha feito um "svn diff> temp.txt" antes de sair do trabalho na sexta-feira, e o arquivo temp.txt ainda estava no meu disco rígido, então fui capaz de alimentar esse arquivo no "patch" e recuperar meu mudanças perdidas.

Mas para minha referência futura (ou seja, da próxima vez que cometer o mesmo erro estúpido) ... há alguma maneira de dizer ao svn para desfazer um "svn revert"? O svn mantém um backup dos diffs locais / não registrados em qualquer lugar?

Jeremy Friesner
fonte
34
IIRC TortoiseSVN move os arquivos revertidos para a lixeira, mas o cliente de linha de comando SVN original não possui tais nuances.
Dario Solera
1
Não consigo encontrar o arquivo na lixeira. Estou sem sorte?
dalcantara
5
Comentário principal sobre a lixeira. Isso salvou meu dia!
OrganicPanda de
2
meu também! muito obrigado. O arquivo revertido simplesmente apareceu na minha lixeira e pode ser restaurado.
sladda de
1
Você acabou de salvar meu traseiro com essa coisa da lixeira !!!
Epirocks de

Respostas:

79

Não, (absolutamente) NÃO .

Se você disser ao Subversion que ele deve reverter um arquivo, todas as alterações foram perdidas pelo vento.

Somente sua memória pode recuperá-los.

Exceção: os novos arquivos que você adicionou, só perderão o status "adicionado", mas o arquivo permanecerá neste diretório, apenas o status é desconhecido ("?")

Exceção de plataforma / software: Usando TortoiseSVN no Windows, Reverter primeiro joga os arquivos na Lixeira e depois os reverte. Você pode cavar na Lixeira para recuperar os arquivos.

Peter Parker
fonte
10
Adendo ao acima: O controle de versão só o ajudará se você realmente enviar os arquivos. Se você está em uma posição de que matar sua cópia de trabalho matará horas de trabalho, então você não está cometendo com freqüência suficiente.
myron-semack
1
Concordo ... neste caso o servidor svn estava fora do ar, e é por isso que eu tinha alterações não confirmadas ainda pendentes. : ^ (
Jeremy Friesner
13
Sim!!! Existe uma maneira de se recuperar dependendo do seu O / S e / ou IDE - leia as outras respostas abaixo antes de ter um ataque cardíaco!
HDave
2
Isso não é verdade, é um pouco mais complicado do que um simples NÃO. Use uma ferramenta de recuperação ou, se tiver sorte, os arquivos estarão na lixeira.
RaphMclee
1
@RalphMclee: Depende da plataforma e do cliente svn. O TortoiseSVN salvará os novos arquivos revertidos na lixeira. Esta é apenas uma exceção. E duvido que uma ferramenta de recuperação possa reconstruir as alterações de seus arquivos de maneira consistente. É muito mais fácil e claro lembrar: reverter destruirá seu trabalho, use-o com cuidado!
Peter Parker
104

Existe uma solução ... vá para a sua lixeira e você encontrará a versão mais recente do arquivo excluído. O Tortoise "joga" na lixeira todos os arquivos que reverte.

shto
fonte
2
Aliás, é também por isso que o TortoiseSVN parece tão lento ao fazer reversões. Mover um arquivo para a lixeira é uma operação muito lenta quando a lixeira está cheia. Você pode desativar este recurso nas configurações "Geral - diálogos 1" do TortoiseSVN.
Wim Coenen
8
Obrigado cara, você me salvou! Eu acidentalmente fiz Reverter e quase perdi 2 semanas de trabalho. Felizmente, encontrei-o na lixeira.
Arie Livshin de
2
@ArieLivshin, por que você trabalharia por 2 semanas sem se comprometer? Parece que você precisa aprender mais sobre branches.
JoelFan
Irritantemente, ankhsvn não faz isso
Phil Hale
Obrigado .. Muito útil.
Prem Singh Bist
32

Na verdade, não é específico do Subversion, mas se você estiver trabalhando com o Eclipse, pode tentar a sorte na história local.

Agora, algo um pouco mais específico do Subversion: se você não quiser fazer um branch para cada mudança que você fizer, você pode manter alguns troncos checados localmente (trunk-modif-1, trunk-modif-2 .. .). Cada "modificação" é feita em uma árvore separada e você só precisa manter uma lista de quais verificações correspondem a quais modificações.

Ou você pode usar o Git localmente, mas nunca tentei.

Vladimir
fonte
3
FYI - acesse o histórico local através do menu de contexto do botão direito "Restaurar do histórico local".
HDave
Para a parte de Eclipse, aqui está uma resposta mais concreta: stackoverflow.com/a/18220708/517705
Sk8erPeter
14

Recentemente, cometi esse erro de não enviar novas alterações de arquivo (cerca de 10) para o SVN e todas elas desapareceram por causa do meu erro bobo. Mas o que me salvou foi a opção "Restaurar versões anteriores" do Windows no menu de contexto. Ufa, isso foi um alívio e lição aprendida.

JProgrammer
fonte
Obrigado! Isso me salvou de refazer horas de trabalho! Nunca vi esse recurso do windows antes, mas salvou meu bacon!
NibblyPig
Para onde posso enviar os $ 6.000 que devo a você por ter economizado dias de trabalho? Lição aprendida ...
HDave
Obrigado, isso salvou meu dia.
Opax Web
Eu mantenho o ponto de verificação de suporte a essa restauração desativado porque isso prejudica o desempenho. Recentemente, o Eclipse excluiu uma pasta de meus projetos, incluindo seu arquivo git, devido a um problema com o recurso Undo, e eu gostaria de tê-lo ativado. No entanto, um programa do Windows chamado Recuva me salvou ao pesquisar o espaço de arquivo excluído. Tive muito cuidado para não adicionar conteúdo adicional à unidade afetada até ter recuperado todos os meus arquivos, e isso me forneceu todos os arquivos de origem alterados desde meu backup mais recente, uma semana antes. A maioria dos arquivos binários não era recuperável.
Carl
8

Você não pode recuperar os arquivos, se estiver usando o cliente de linha de comando svn .

Mas você pode recuperá-los, se você estiver usando TortoiseSVN como seu cliente svn. O TortoiseSVN irá movê-los automaticamente para a sua Lixeira. Você pode restaurá-los a partir daí após uma reversão acidental.

Esta é uma opção configurável no TortoiseSVN. Está em Configurações -> Diálogo 1 -> Usar lixeira ao reverter.

Por padrão, ele está marcado, o que significa que os arquivos são movidos para a lixeira. Se você quiser (na maioria das vezes, você não se importa em desativar isso. Se tiver um motivo, entre em contato comigo)

Manohar
fonte
1
Incrível! ... me salvou
Janani Kumar
6

Se estiver usando o InteliJ, você é uma pessoa de sorte. No menu superior, você tem uma opção de Controle de Versão, e abaixo dela você encontrará a opção de histórico local, onde você encontrará todo o histórico do arquivo selecionado, incluindo todas as operações que você fez com aquele arquivo (atualizar, confirmar, reverter).

Boa sorte, arkde

Aureliano Cotuna
fonte
1
E se for um novo arquivo, o próprio arquivo será excluído. Nesse caso, selecione a pasta em que o arquivo estava na visualização Projeto e, a seguir, selecione 'Histórico Local'. O IntelliJ salvou o dia novamente.
Nufail
4

Além disso, se você reverteu seu código .NET (arquivos .cs etc) e construiu seu aplicativo antes de reverter, mas depois de fazer alterações, você pode recuperar as alterações do arquivo de montagem usando qualquer uma das ferramentas refletoras para visualizar o código.

scor4er
fonte
2

Revertei a solução (Visual Studio + AnkhSVN) e perdi as alterações de alguns arquivos. Não consigo encontrar o arquivo na lixeira.

MAS: eu recuperei meus arquivos perdidos com o Handy Recovery, ou seja, o SVN apenas apaguei meus arquivos ao reverter.

Use qualquer software de recuperação de dados para recuperar arquivos revertidos (como o teste Handy Recovery )

Peter Barbanyaga
fonte
2

Tive a extrema sorte de encontrar um log de alterações local do arquivo (revisões locais) no navegador de histórico no Eclipse. Eu estava inspecionando as diferenças uma a uma e fiz algumas salvações no arquivo antes de sobrescrever.

Fyts
fonte
1

Não, o SVN não mantém um log ou backup (embora haja uma solução para o TortoiseSVN mencionada nas outras respostas).

Mas caso alguém esteja navegando nas respostas e não tenha percebido este comentário na pergunta do OP:

"Felizmente, neste caso, eu fiz um" svn diff> temp.txt "antes de sair do trabalho na sexta-feira, e o arquivo temp.txt ainda estava no meu disco rígido, então consegui alimentar esse arquivo no" patch "e recuperar minhas mudanças perdidas. "

Eu imagino que seja um paradigma comum fazer 'svn diff' ANTES de fazer um 'svn revert'. Se você adquirir o hábito de fazer isso, mesmo que o diff acabe de ser ecoado no terminal, você tem pelo menos um caminho possível para recuperar suas alterações perdidas.

Shaneb
fonte