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.)

zoul
fonte
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ê.

vcsjones
fonte
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) ;)'
Niklauzg
fonte
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.

Vivek Yadav
fonte
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

Abe Voelker
fonte
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
Denny Weinberg
fonte
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
Andriy F.
fonte
2

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


fonte
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

user1299374
fonte
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 )

ThorSummoner
fonte