Como posso remover todas as minhas alterações no diretório ativo do SVN?

195

Eu tenho um diretório de trabalho SVN. Fiz algumas alterações nesse diretório e ele aparece em svn status. Mas existe alguma maneira de remover todas as minhas alterações e obter tudo do tronco usando a linha de comando?

n179911
fonte

Respostas:

274
svn revert -R .
svn up

Isso reverterá recursivamente o diretório atual e tudo o que está abaixo dele e depois será atualizado para a versão mais recente.

Mike McQuaid
fonte
2
Observe que isso não funciona com externos (eles são ignorados, aparentemente).
22690
86

Usei uma combinação das respostas de outras pessoas para chegar a esta solução:

Reverter alterações normais do SVN local

svn revert -R .

Remova qualquer outra alteração e suporte a remoção de arquivos / pastas com espaços, etc.

svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf

Não se esqueça de obter os arquivos mais recentes do SVN

svn update --force
Shaize
fonte
Muito obrigado Shaize, este é o sed mais elegante, ... cachimbo que vi até agora por isso :) Especialmente cuidando dos ignores também.
bully
Funciona como um encanto. Obrigado!
Niilo Keinänen
28
svn revert -R .
svn cleanup . --remove-unversioned
lexa-b
fonte
Ele não remove arquivos * .class etc.
Trismegistos
2
Se você também quiser remover Arquivos- ignoradosvn cleanup . --remove-ignored
Kip
14

Se você não tiver alterações, poderá sempre ser realmente completo e / ou preguiçoso e fazer ...

rm -rf *
svn update

Mas, na verdade, não faça isso, a menos que você tenha certeza de que a opção nuke-from-space é o que você deseja! Isso tem a vantagem de também remover todas as cruft de compilação, arquivos temporários e coisas que o SVN ignora.

A solução mais correta é usar o comando revert:

svn revert -R .

O -R faz com que o subversion recursione e reverta tudo dentro e abaixo do diretório de trabalho atual.

bbum
fonte
Eu costumava usar esse truque, mas com o SVN 1.7, onde os metadados são armazenados apenas na raiz do WC, essa não é mais a solução limpa que era. Por exemplo, os arquivos excluídos permanecem excluídos.
Bart van Heukelom
8
svn nuke-from-space
quer
9

Nenhuma das respostas aqui era exatamente o que eu queria. Aqui está o que eu vim com:

# Recursively revert any locally-changed files
svn revert -R .

# Delete any other files in the sandbox (including ignored files),
# being careful to handle files with spaces in the name
svn status --no-ignore | grep '^\?' | \
    perl -ne 'print "$1\n" if $_ =~ /^\S+\s+(.*)$/' | \
    tr '\n' '\0' | xargs -0 rm -rf

Testado no Linux; pode funcionar no Cygwin, mas conta com (acredito) uma extensão específica do GNU que permite que os xargs se dividam com base no '\0'espaço em branco e não no espaço em branco.

A vantagem do comando acima é que ele não requer nenhuma atividade de rede para redefinir a sandbox. Você obtém exatamente o que tinha antes e perde todas as alterações . (isenção de responsabilidade antes que alguém me culpe por esse código destruindo seu trabalho) ;-)

Uso esse script em um sistema de integração contínua em que quero garantir que uma compilação limpa seja executada após a execução de alguns testes.

Edit : Não tenho certeza se isso funciona com todas as versões do Subversion. Não está claro se o svn statuscomando sempre é formatado de forma consistente. Use por sua conta e risco, como em qualquer comando que use esse rmcomando geral .

mpontillo
fonte
7

svn revert desfará todas as alterações locais que você fez

Sean
fonte
5

Você pode usar o seguinte comando para reverter todas as alterações locais:

svn st -q | awk '{print $2;}' | xargs svn revert
NaN
fonte
Recebo a mensagem de erro "Argumentos insuficientes" para svn revert
circular
4
svn status | grep '^M' | sed -e 's/^.//' | xargs rm

svn update

Irá remover qualquer arquivo que foi modificado. Parece que me lembro de ter problemas com a reversão quando arquivos e diretórios podem ter sido adicionados.

Juan
fonte
0

Se você estiver no Windows, o seguinte loop for reverterá todas as alterações não confirmadas feitas no seu espaço de trabalho:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)

Se você deseja remover todas as alterações não confirmadas e todos os objetos não versionados, serão necessários 2 loops:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)
for /F "tokens=1,*" %%d in ('svn st') do (
  svn rm --force "%%e"
)
David
fonte