Existe um comando do Subversion para redefinir a cópia de trabalho?


110

Existe um único comando Subversion que “redefiniria” uma cópia de trabalho exatamente para o estado que está armazenado no repositório? Algo como git reset --hardou (ha, hard Git reset também não remove arquivos não versionados!) rm -rf wc && svn co <url> wc.

Atualização: Não estou atrás de uma simples reversão, já que isso não exclui arquivos extras na cópia de trabalho. Eu realmente quero algo que seja o mesmo que excluir a cópia de trabalho e fazer check-out novamente, só que sem ter que baixar os dados novamente. (Obviamente, não me importo em perder todas as alterações não comprometidas.)


reverter todas as alterações na cópia de trabalho?
— mauris

5
Você usaria git clean -xdfpara remover coisas que não estão sob controle de origem.
— vcsjones 01 de

1
@vcsjones: Obrigado, a página de manual para git cleancitações exatamente o que estou procurando: “Isso pode ser usado (possivelmente em conjunto com git reset) para criar um diretório de trabalho pristine para testar uma construção limpa.” É uma pena que o Subversion não pareça ter nada parecido com isso embutido.
— zoul 01 de

Respostas:


180

Você pode reverter recursivamente assim:

svn revert --recursive .

Não há como (sem escrever um script criativo) para remover coisas que não estão sob o controle da origem. Acho que o mais próximo que você pode fazer é iterar sobre todos os arquivos, usar o resultado de svn listgrep e, se o grep falhar, excluí-lo.

EDIT : A solução para o script criativo está aqui: Remover automaticamente os arquivos não versionados do Subversion

Portanto, você pode criar um script que combine revertcom a resposta na pergunta vinculada que melhor se adequar a você.


3
Você pode querer executar svn cleanupprimeiro no wc também. Esta é minha prática padrão para limpar após mesclagens abortadas e outros enfeites.
— Mike Miller

O tortoise também tem uma opção "remover arquivos não versionados" na caixa de diálogo de limpeza.
— v.oddou

2
Seria bom se "remover arquivos não versionados" estivesse disponível através da linha de comando. Especialmente para compilações automatizadas.
— C. Tewalt

3
Veja minha resposta ... --remove-unversioned existe para svn cleanup
— Denny Weinberg

38

Para reverter arquivos rastreados

svn revert . -R

Para limpar arquivos não rastreados

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

A -rfprincípio pode / deve parecer assustador, mas uma vez compreendido, não será por estes motivos:

  1. Apenas diretórios totalmente não rastreados irão corresponder ao padrão passado para rm
  2. O -rfé obrigatório, caso contrário, esses diretórios não serão removidos

Para reverter e depois limpar (a questão OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Para uma facilidade de uso consistente

Adicione um alias permanente aos seus .bash_aliases

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

o segundo snippet não parece funcionar para mim:awk: fatal: error reading input file '-': Input/output error
— hbogert

Tive que escapar do ?no awkcomando, caso contrário, ele correspondeu a todas as linhas na saída desvn status
— gpanders

23

Exclua tudo dentro de sua cópia local usando:

rm -r your_local_svn_dir_path/*

E reverta tudo recursivamente usando o comando abaixo.

svn revert -R your_local_svn_dir_path

Isso é muito mais rápido do que excluir todo o diretório e, em seguida, fazer um novo checkout, porque os arquivos estão sendo restaurados dos metadados SVN locais. Nem precisa de uma conexão de rede.


4
muito mais rápido é svn cleanup --remove-unversioned.
— Znik

7
svn revert . -R

para reiniciar tudo.

svn revert path/to/file

para um único arquivo


1
Isso não exclui arquivos extras não versionados da cópia de trabalho, certo?
— zoul 01 de

@zoul Acho que não, mas não me cite sobre isso, já que faz um tempo que não uso o SVN
— Abe Voelker

infelizmente não toca em arquivos não rastreados. tente svn revert -R your_local_svn_dir_path
— Znik

7

Exclua arquivos não versionados e reverta quaisquer alterações:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Fora:

D         D:\tmp\sql\update\abc.txt

1
esta é a melhor resposta, sem scripts adicionais. isso é universal e compatível com muitas versões do SVN.
— Znik de

3

Solução cmd / bat do Windows puro:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

Excluir a cópia de trabalho do sistema operacional e verificar novamente é o mais simples, mas obviamente não é um único comando.


Dolorosamente lento. É por isso que eu estava procurando uma maneira de contornar isso.
— zoul 01 de

1
+1, muitas vezes esta é a única maneira de corrigir problemas estranhos, pelo menos que eu encontrei.
— Brad

2

Muito rápido e simples e faz exatamente o que você deseja

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

O /(config|.ini)/ é para meus próprios propósitos.

E pode ser uma boa idéia adicionar --no-ignore ao comando svn


2
Isso é tão horrível. E quanto aos usuários do Windows? O Subversion obviamente precisa de um pouco de trabalho antes de ser levado a sério como uma ferramenta de controle de versão.
— Warren P

1

Para remover arquivos não rastreados

Consegui listar todos os arquivos não rastreados relatados por svn stno bash fazendo:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Se estiver com sorte, você pode substituir echopor rmpara excluir arquivos não rastreados. Ou copie os arquivos que deseja excluir manualmente, se não tiver sorte.


(Usei a resposta de @abe-voelker para reverter os arquivos restantes: https://stackoverflow.com/a/6204601/1695680 )

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.