Como “recuperar” uma pasta deletada no Subversion / TortoiseSVN?

96

Excluímos acidentalmente a pasta 'tags' de nosso repositório Subversion onde pretendíamos apenas excluir uma tag específica. Qual é a maneira mais fácil de recuperar a pasta 'tags'?

Usamos o TortoiseSVN como nosso cliente e pensei que quando for ao navegador do repo e mostrar o log, haverá algo como "reverter alterações desta revisão" semelhante ao que você pode ver em um diálogo semelhante em sua cópia de trabalho. Mas não existe tal comando lá ...

Borek Bernard
fonte

Respostas:

115

Basta copiar a pasta excluída de uma revisão anterior.

No Navegador do Repositório, clique no botão denominado HEAD (no canto superior direito) para mostrar uma revisão onde sua pasta ainda existe, então clique com o botão direito do mouse nessa pasta e selecione "Copiar para ..." e insira o caminho para você deseja que a pasta seja recriada (provavelmente o mesmo caminho que já está na caixa de texto).

Mikael Sundberg
fonte
4
Ótima dica, obrigado. Uma pegadinha do TortoiseSVN - naquela caixa de diálogo "copiar para ..." eu tive que mudar o caminho de 'example.com/svn/tags' para 'tags1' e então voltar para o botão OK ser ativado.
Borek Bernard
2
Isso pode ser bom para tags, mas não deve ser feito para desfazer a exclusão de nenhuma outra pasta, pois você perderá o histórico
slckin
3
Ele mantém a história, apenas o fez.
acdcjunior
apenas certifique-se de desmarcar "Parar ao copiar / renomear" ao visualizar o log, caso contrário, o TortoiseSVN não mostrará o histórico antes de sua ação de restauração (obviamente) ...
Oli
Funcionou totalmente. Economizei muito do meu tempo. Obrigado :)
dgupta3091
78

para os entusiastas da linha de comando:

  • primeiro encontre o número da revisão onde sua exclusão aconteceu:

    svn log -v http://svnserver/path/to/folderContainingDeletedFolder
    

digamos que você acha que o diretório foi excluído na revisão 999 (aliás: você pode achar mais fácil encontrar o número da revisão com o navegador svn repo)

  • copie a pasta da revisão menos 1

    svn copy http://svnserver/path/to/folderContainingDeletedFolder/deletedFolder@998 http://svnserver/path/to/folderContainingDeletedFolder/deletedFolder -m "undeleted folder"
    

voilà pronto!

no seu caso, pode ser:

    svn copy http://svnserver/project/tags@998 http://svnserver/project/tags -m "undeleted folder"
Raudi
fonte
1
Obrigado .. economizou muito tempo
Dharani Kumar
Isso acabou de salvar meu bacon!
axiopisty
Só queria confirmar que a abordagem "svn copy" de fato preserva todo o histórico e, para pastas, ela opera recursivamente, restaurando a pasta e todos os filhos.
WallStProg de
11

A maioria dessas respostas funcionará até certo ponto, mas a resposta correta é a de Daniel. Faça uma mesclagem reversa. Dessa forma, você mantém o histórico da versão.

svn merge -r R1:R2

onde R1 é a revisão em que você está e R2 é a revisão que contém o arquivo / pasta excluído.

Milhas
fonte
1
Em uma mesclagem reversa, R1 deve ser a revisão que você deseja reverter, com R2 sendo a revisão anterior.
arleslie
2
Você não perde nenhuma história com svn copy.
maxschlepzig
Para aqueles de nós que não são entusiastas da linha de comando, consulte: tortoisesvn.net/docs/nightly/TortoiseSVN_en/…
Pascal
2
Isso não restauraria todos os arquivos / pastas excluídos? Isso funcionaria se eu só quisesse restaurar uma pasta excluída específica, mas não outras pastas excluídas?
JO 7 de
8

Você precisará fazer uma mesclagem reversa .

Para obter detalhes sobre como fazê-lo (e praticamente qualquer outra coisa que você queira ou precise fazer com o SVN), o livro oficial está disponível online .

Daniel
fonte
3

Continuando com a resposta de Raudi, que funcionou para mim após esta revisão.

Alguns clientes svn podem precisar do número de revisão especificado usando o parâmetro de revisão -r em vez de usar @ após a pasta como segue:

svn copy svn://svnserver/project/tags svn://svnserver/project/tags **-r 998** -m "undeleted folder"
Paulo
fonte
Se você estiver restaurando de uma pasta que ainda existe, -r <revision>funcionará. No entanto, se estiver tentando restaurar a pasta diretamente, você precisará usar @<revision>. Caso contrário, ele informará que o arquivo não foi encontrado.
arleslie
2

Repository Browserpara a sua repository, clique com o botão direito na pasta pai onde existia a pasta excluída . Agora, Show Logda pasta pai e selecione a revisão anterior onde você confirmou a operação de exclusão. Você terá uma lista e clique com o botão direito na pasta das informações de revisão e selecione Update to this Revision.

Você terminou

Abdul Munim
fonte
Ah, entendo, não estava na caixa de diálogo Mostrar Log, mas na janela principal do navegador do repo. Ainda assim, esse comando tentará atualizar minha cópia de trabalho local enquanto eu gostaria de consertar esse problema no servidor diretamente (você pode imaginar que verificar centenas de tags, cada uma contendo milhares de arquivos, não é exatamente o que eu gostaria façam).
Borek Bernard
Funcionou para mim A opção do menu de contexto (ao clicar com o botão direito) é "Reverter alterações desta revisão" e iria reverter mesclar as alterações.
hsg de