Comando SVN para excluir todos os arquivos ausentes localmente

134

No SVN, existe um comando que posso usar para excluir todos os arquivos ausentes localmente em um diretório?

Ou, na sua falta, alguma maneira de listar apenas os arquivos que estão faltando (ou, no caso mais geral, têm status A, D,?, Etc.)

wheresrhys
fonte
1
Eu mantenho uma pasta de trabalho e uma pasta de checkout. E mova apenas arquivos da pasta de trabalho para a pasta de check-out. Se uma pasta precisar ser adicionada / removida, eu a faço manualmente e depois movo os arquivos para essa pasta (por exemplo, novos pacotes, pacotes antigos). A maioria dos problemas de svn acontece quando você move as pastas da sua cópia de trabalho. Mesmo ao copiar arquivos da sua cópia de trabalho para a cópia de saída, você deve mover apenas arquivos, não pastas.
Siddharth

Respostas:

99

Se você estiver usando o TortoiseSVN, faça uma verificação de modificações , classifique pela coluna Status , selecione todas as entradas marcadas missing, clique com o botão direito do mouse para abrir o menu de contexto e selecione Excluir . Por fim, comprometa-se a publicar as alterações no repositório.

Se você estiver no Windows, mas prefere a linha de comando e gosta de se divertir no PowerShell, esse recurso de uma linha fará o seguinte:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

Ou seja, filtre a saída apenas para as linhas que mostram os arquivos ausentes (indicados por uma exclamação no início da linha), capture o nome do arquivo associado e execute um svn rmnesse nome.

(Postagem no blog Remover todos os arquivos “ausentes” de uma cópia de trabalho SVN faz algo semelhante para Unix / Linux.)

Michael Sorens
fonte
existe uma maneira no eclipse usando o plug-in subclipse? é tão ruim atualizar e depois encontrá-los no projeto e excluí-los novamente.
295 Stan Stan
Para sua informação, se uma senha de subversão for necessária aqui é a sintaxe: svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Jogos [1] --username nome_do_usuário_aqua - senha senha_aquela}
Jeff
você deve primeiro confirmar após esta linha antes de executar svn up? porque os arquivos são restaurados a partir do servidor svn
Pierre
Essa ação também excluirá os arquivos do repositório?
Sebastián Ulloa
175

Se você estiver usando Mac ( Darwin ) ou Linux, poderá canalizar as saídas dos seguintes comandos svn rmpara todos os arquivos ausentes. Você pode definir o diretório de trabalho atual como o diretório ou subdiretório apropriado antes de executá-los - dependendo se você deseja executar toda a sua cópia de trabalho ou apenas um subconjunto.

  1. Executar um status svn
  2. Procure por linhas que começam com "!" (ausência de)
  3. Imprima o "--force" (argumento svn) e a segunda coluna (o nome do arquivo) da saída do # 2
  4. Executar svn rmusando a saída de # 3 como argumentos

Portanto, o comando completo é:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

Referências:

Peter Ajtai
fonte
4
Isso não funciona se houver espaços no nome do arquivo. Eu não sei awk suficiente para consertar isso, no entanto.
bugloaf
2
Use awk '{print " --force "$2"@"}'se o seu nome de arquivo contiver um @(se você é um desenvolvedor iOS, por exemplo)
Guillaume Algis
1
E manipule um nome de arquivo com espaços em branco, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'deve fazer o truque (e começa a parecer feio)
Guillaume Algis
12
O comando completo que cuida do espaço é "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
HelloWorld
1
Por que você não coloca a --forceparte xargs?
GTC
53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Filtrar apenas nos arquivos ausentes
  3. Cortar ponto de exclamação
  4. Filtrar os espaços em branco à direita
  5. Adicionar cotação principal
  6. Adicionar cotação à direita
  7. svn remove cada arquivo
ivrin
fonte
Esta solução funciona se houver espaços nos arquivos / diretórios.
yuric
Como se adiciona verbosidade a isso? xargs -verbose svn rm?
TekiusFanatikus # 9/17
1
Apenas uma dica para usuários de scripts etc., este comando falhará se nenhum arquivo a ser excluído for encontrado: svn: E205001: Tente 'svn help delete' para obter mais informações svn: E205001: Não há argumentos suficientes
Thorsten Schöning
1
O problema do @ ThorstenSchöning pode ser corrigido adicionando -ràs xargsopções (não execute, se nem argumentos forem fornecidos). Além disso, o número de argumentos deve ser limitado e as remoções devem ser agrupadas em lotes porque a chamada falha com um número muito grande de arquivos para remover, por exemplo -n 500. E por último, mas não menos importante, a citação realizada é subótima para arquivos que contêm especiais do shell, como $- melhor uso \ncomo delimitador e deixe a citação para xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui
19

Obrigado a Paul Martin pela versão do Windows.

Aqui está uma pequena modificação no script para que os arquivos do Windows com espaços também sejam levados em consideração. Além disso, o missing.listarquivo será removido no final.

Salvei o seguinte em svndel.bat no meu diretório bin SVN (definido no meu ambiente %% PATH) para que ele possa ser chamado de qualquer pasta no prompt de comando.

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL
user3689460
fonte
bom ver algum código inovador lote ainda aparecendo :)
user230910
Uau, ótima resposta. Eu estava prestes a usar o PowerShell, mas isso era muito mais fácil.
Jim Andrakakis
Eu adicionei outra linha depois del missing.list 2>NUL, porque eu adicionei todos os novos arquivos diretamente após remover os arquivos excluídos pela primeira vez, missing.listpara adicionar ao svn: svn delete "missing.list"funcionou comigo
Pierre #:
Eu modifiquei esse script para tentar executar a partir de um local arbitrário e, em seguida, encontrei esse problema stackoverflow.com/questions/1137219/…, portanto parece que você DEVE usar o Diretório de Trabalho Atual para executar esta ação.
aolszowka
7

Eu gosto da opção PowerShell ... Mas aqui está outra opção se você estiver usando scripts em lote do Windows:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
Paul Martin
fonte
5

Uma alternativa que funciona no Linux (bash) para arquivos a serem removidos que não contêm espaços no caminho:

svn delete `svn status | grep! | awk '{print $ 2}' '
gilyen
fonte
4

Esse script de shell examina recursivamente ( svn status) diretórios em seu projeto, removendo arquivos ausentes (conforme a pergunta exigir) e adicionando novos arquivos ao repositório. É uma espécie de "armazenar no repositório o instantâneo atual do projeto".

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done
cibercitizen1
fonte
4

Uma ligeira modificação na linha de comando, que funciona no Mac OS (esperançosamente até no Linux) e lida com os arquivos que o comando "svm sr" relata, como "! M" (ausente e modificado).

Ele lida com espaços nos arquivos.

É baseado na modificação de uma resposta anterior:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm
Stefano Bossi
fonte
4

Na verdade, é possível remover completamente o missing.listuser3689460 e Paul Martin

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Amfasis
fonte
para referência - este é DOS / cmd.exe no windows land
user230910 10/10
2

Ao lidar com muitos arquivos, pode acontecer que a entrada do argumento para xargs esteja ficando muito longa. Fui para uma implementação mais ingênua, que também funciona nesse caso.

Isto é para Linux:

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done
Jonas Eberle
fonte
1

Versão melhorada

Portanto, o comando completo é:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
Zeta
fonte