Como posso excluir todos os arquivos / pastas não versionados / ignorados na minha cópia de trabalho?

136

Se eu tenho uma cópia de trabalho de um repositório do Subversion, existe uma maneira de excluir todos os arquivos não versionados ou ignorados nessa cópia de trabalho com um único comando ou ferramenta? Basicamente, estou procurando o analógico SVN git clean.

Uma linha de comando ou uma solução da GUI (para o TortoiseSVN) seria aceitável.

Nick Meyer
fonte

Respostas:

98

Usando o TortoiseSVN:

Stefan
fonte
7
Bom recurso! No entanto, tive que ler o link para descobrir que ele funciona apenas na exibição de lista (não na exibição em árvore) no XP - talvez você deva incluí-lo na sua resposta.
Nick Meyer
5
A versão da linha de comando do svn (especificamente no Windows) não fornece a mesma função?
BLONG
3
Como alguém apontou abaixo:svn cleanup --remove-unversioned --remove-ignored .
haui 03/07/19
133
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Este possui os seguintes recursos:

  • Arquivos ignorados e não rastreados são excluídos
  • Funciona mesmo que um nome de arquivo contenha espaço em branco (exceto para nova linha, mas não há muito o que fazer sobre isso além de usar a --xmlopção e analisar a saída xml resultante)
  • Funciona mesmo que svn statusimprima outros caracteres de status antes do nome do arquivo (o que não deveria porque os arquivos não são rastreados, mas apenas no caso ...)
  • Deve funcionar em qualquer sistema compatível com POSIX

Eu uso um script de shell chamado svncleanque contém o seguinte:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done
Richard Hansen
fonte
2
Exatamente o que eu estava procurando, funciona como um encanto também no linux e no MacOS!
rich
Você precisa redefinir o IFS? Eu escolhi não criar um script 'svnclean'. assim que eu estou querendo saber se isso vai estragar IFS para o resto do script ...
C. Tewalt
3
@ matrixugly: Não, você não precisa IFSvoltar ao que era antes. Quando você faz isso VARNAME=value command, a atribuição de valuea VARNAMEse aplica apenas durante a execução de command(com algumas exceções que não se aplicam a read). Consulte a especificação POSIX e este relatório de erros do POSIX para obter mais detalhes.
Richard Hansen
@rich, obrigado por compartilhar isso. Veio à procura de uma solução de limpeza svn há alguns anos e também saiu com algum conhecimento sobre scripts de shell! Evidentemente, voltei a esta resposta bastante.
C. Tewalt 13/07/2016
120

Eu sei que isso é antigo, mas no caso de alguém tropeçar nele, versões mais recentes (1.9 ou posterior) do suporte ao svn --remove-unversioned, por exemplo svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options

Neil
fonte
18
Para mim, esta é a resposta certa. É uma resposta de linha de comando de plataforma cruzada. Além disso, você pode remover arquivos ignorados comsvn cleanup . --remove-ignored
Dan Atkinson
1
Funciona no svn 1.6 ou superior.
wegry 9/09/16
2
Por favor, altere isso em 1,9, ver também subversion.apache.org/docs/release-notes/1.9.html (eu tentei localmente e não funcionou, e eu estou em 1.8.8)
ikku100
2
Parece que o problema é que ele não remove pastas não versionadas .
Nyerguds
1
@ Nyerguds: Verdade, isso não exclui pastas sem versão, mas apenas arquivos sem versão. Alguém encontrou uma solução?
Dhiraj suvarna
42

Esse oneliner pode ajudar você a:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

Use com cuidado!

jkramer
fonte
13
Isso não remove arquivos ignorados e vai quebrar se o nome do arquivo contém espaços em branco
Richard Hansen
1
Ele também não exclui arquivos ignorados
plaisthos
4
Você pode usar svn status --no-ignorepara capturar um poço dos arquivos ignorados.
código é 9/13
3
De fato, considero um recurso deixar os arquivos ignorados no local, opcionalmente.
macetw
15

Modificando as respostas de Yanal-Yves Fargialla e gimpf usando o Powershell (mas não é permitido comentar a postagem original de Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

Isso adiciona o quilate ("^") para especificar o início da linha, evitando a correspondência de todos os arquivos que contêm a letra "i". Adicione também os sinalizadores para -recurse e -force para rm para tornar esse comando não interativo e utilizável em um script.

gwilk
fonte
O comando precisa de uma citação dupla extra no final. Eu apenas adicionaria, mas as edições devem ter pelo menos seis caracteres, aparentemente.
11262 Ian Ian
7

Muitas coisas no SVN podem ser feitas de maneiras diferentes, conforme evidenciado pelas variadas respostas da linha de comando fornecidas aqui. Com o advento da versão 1.7, existe outra técnica para o TortoiseSVN que, de fato, fornece uma resolução mais refinada do que a resposta de Stefan, permitindo que você selecione arquivos sem versão separadamente dos arquivos ignorados. Basta selecionar TortoiseSvn >> Clean up...para abrir esta caixa de diálogo.

Opções de limpeza do TortoiseSVN

Michael Sorens
fonte
7

Com PowerShell:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

Na linha de comando:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
Yanal-Yves Fargialla
fonte
3
Eu amo esse script puro do Windows! Eu recomendaria o uso -match '[\?i]' -replace '^.{8}', que funciona corretamente mesmo que um nome de arquivo comece com um espaço em branco e também exclua os arquivos ignorados.
gimpf
1
O uso do twimp sugerido pelo gimpf funciona bem, mas encontrei um caso em que encontrei uma ItemNotFoundException. Acontece que havia apenas um único arquivo no conjunto de resultados do status svn. Esse ajuste corrige esse problema: code@ (svn status --no-ignore) -match '[\? I]' -place ''. {8} '| rm `. Descobri-lo com a ajuda deste post
dirtybird
1
e como isso solicitará diretórios que não estão no svn (como a recurs não foi especificada), não é bom usá-lo em um script. Use:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber
6

Este oneliner funciona para mim (com base na resposta de Richard Hansen, que surpreendentemente não funcionou para arquivos que contenham espaços):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
Dennis Golomazov
fonte
2
para excluir pastas não versionadas também, adicione -frao rmcomando: svn status --no-ignore | grep '^ [I?]' | corte -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov
5

Usando o TortoiseSVN:

  1. Clique com o botão direito do mouse na raiz da cópia de trabalho e selecione TortoiseSVN -> "verifique se há modificações"
  2. Selecione "Mostrar arquivos ignorados"
  3. Classificar por coluna "Status do texto"
  4. role até os arquivos "sem versão", agora todos agrupados; selecione todos e clique com o botão direito -> excluir
  5. role até os arquivos "ignorados", agora todos agrupados; selecione todos e clique com o botão direito -> excluir

Não é realmente uma solução agradável e limpa, mas a maneira mais rápida que conheço (no Windows).

Obrigado ao pkh pela dica com os arquivos ignorados.

Thomas Lötzer
fonte
Acredito que isso removerá apenas arquivos sem versão. Itens ignorados não serão afetados.
Dirk Vollmar
2
Você não precisa usar o diálogo de confirmação e pode receber arquivos ignorados: Clique com o botão direito do mouse | TortoiseSVN | Verifique se há modificações. Em seguida, você pode clicar em 'Mostrar arquivos ignorados' e classificar / excluir adequadamente.
pkh
4

Isso é semelhante a outras respostas, mas na verdade recebe arquivos ignorados (observe o 'I' nos REs):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
pkh
fonte
1
Isso quebra se um nome de arquivo contém espaços em branco
Richard Hansen
4

Alguém disse que você não pode fazer isso na linha de comando do Windows.

Touro.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

Faz isso em uma linha e não requer uma única ferramenta GNU. :)

ChokesMcGee
fonte
for /f "tokens=2 delims= " %%I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%%I" & rmdir /S /Q "%%I")
Darien Pardinas
@DarienPardinas, sua versão é especialmente útil se você conectar um Jenkins "Execute Windows batch command", que acabei de aprender que não é um prompt de comando, mas sim um script em lote, portanto, a necessidade de %%over%
jxramos
1

você não pode excluí-los apenas com a linha de comando SVN (embora não tenha certeza das ferramentas da GUI) se estiver no sistema linux, isso pode ajudar:

http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/

O outro método (brutal) é confirmar alterações, excluir tudo da pasta e fazer checkout novamente.

Juriy
fonte