O SVN desfaz a exclusão antes da confirmação

135

Se você excluir um diretório de uma cópia de trabalho SVN, mas ainda não tiver confirmado, não é óbvio como recuperá-lo. O Google até sugere "svn undo delete before commit" como uma consulta comum quando você digita "svn undo d", mas os resultados da pesquisa são inúteis.

edit: Eu gostaria de uma solução que funcione no subversion 1.4.4

Laca
fonte
Existem diretórios irmãos para aquele que você excluiu com alterações pendentes? Nesse caso, tenha cuidado ao reverter de um nível superior, pois poderá perder alterações.
Russell

Respostas:

145

svn revert deletedDirectory

Aqui está a documentação para o svn revertcomando.


EDITAR

Se deletedDirectoryfoi excluído usando rmdire não svn rm, você precisará fazer

svn update deletedDirectory

em vez de.

Michael Hackner
fonte
3
Isso deve ser novo, não funciona no SVN 1.4.4. (Foi a primeira coisa que eu tentei.)
Lac
4
É o que 1.4.4 diz: use: revert PATH ... Nota: este subcomando não requer acesso à rede e resolve quaisquer estados conflitantes. No entanto, ele não restaura os diretórios removidos.
LaC
1
1.6.6 tem o mesmo texto na ajuda, mas funcionou para mim quando o testei. Observe que, se você não usou svn deletepara excluir o diretório, mas o excluiu usando rmdir, será necessário svn update deletedDirectory.
22611 Michael Hackner
Eu apaguei um arquivo (svn del) de um diretório svn-ed local. svn update não funcionou, mas svn revert funcionou. Eu estava usando o SynchroSVN para Mac. No entanto, obrigado pelas dicas.
karim
5
Conforme o link, use svn -R revert para recuperar o diretório inteiro com todo o conteúdo, o que provavelmente é o que você deseja. svn revert sem o -R apenas restaura o diretório, não o conteúdo.
N13 01/08/19
156

1) fazer

svn revert . --recursive

2) analisar a saída para erros como

"Failed to revert 'dir1/dir2' -- try updating instead."

3) chame svn up para cada um dos diretórios de erro:

svn up dir1/dir2
Denis Barmenkov
fonte
12
Esta é a resposta mais precisa, muito obrigado, você me ajudou muito.
91111 greenlandman
1
Exceto que reverte tudo? Você pode não querer fazer isso.
n13
1
Isso faz mais sentido se você tiver uma pasta inteira que o SVN acha que foi excluída. Eu tive isso enquanto verificava uma cópia de trabalho. Uma pasta já existia, por isso foi colocada em conflito e não foi retirada. Era um link para outra pasta. Renomeei e tentei svn upfazer o check-out, percebi o conflito, fiz svn resolved fooe svn statusme disse que eu tinha cerca de 10k arquivos marcados como D. svn upe svn revertnão os recuperou, mas isso resolveu o problema.
simbabque 18/02
6
+1 para o --recursivequal ajuda a restaurar o conteúdo dos diretórios excluídos.
Melebius
1
Oh meu Deus, você salvou minha noite!
ArturOlszak 6/03/16
32

O que funcionou para mim é

svn revert --depth infinity deletedDir
Jason
fonte
Isso funcionou muito bem para mim (svn 1.7.10), onde o svn revert deleteDir falhou ao executar o trabalho. Excelente resposta.
Rtome 29/05
4

Faça uma operação de reversão (recursiva) de um nível acima do diretório que você excluiu.

Greg Hewgill
fonte
1
Isso eliminará WAY mais alterações do que o necessário.
Michael Hackner 24/11/2009
Isso não funciona com o Subversion 1.4.4 (eu apenas tentei). O svn help revert até diz "este subcomando não requer acesso à rede e resolve quaisquer estados conflitantes. No entanto, ele não restaura os diretórios removidos". Sinto muito, eu deveria ter especificado a versão. 1.4.4 é o que acompanha o Mac OS X 10.5.
LaC 24/11/2009
4

Para transformá-lo em uma linha, você pode tentar algo como:

svn status | cut -d ' ' -f 8 | xargs svn revert
Earle
fonte
Eu posso criar um diretório com espaços em seu nome. Pode quebrar o AFAIK 'cortado'.
Denis Barmenkov 08/04/19
1

A solução mais simples que encontrei foi excluir o diretório pai da cópia de trabalho (com rm -rf, não svn delete) e executar o svn update nos avós. Por exemplo, se você excluiu a / b / c, rm -rf a / b, cd a, svn up. Isso traz tudo de volta. Obviamente, essa é apenas uma boa solução se você não tiver outras alterações não confirmadas no diretório pai que deseja manter.

Espero que esta página esteja no topo dos resultados da próxima vez que pesquisar esta pergunta no Google. Seria ainda melhor se alguém sugerisse um método mais limpo, é claro.

Laca
fonte
Isso pressupõe que não haja subdiretórios no pai que tenham alterações pendentes.
Russell
0

Você pode remover a pasta e atualizar o diretório pai antes de confirmar:

rm -r some_dir

svn update some_dir_parent

xinthose
fonte