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.)
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.)
Respostas:
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 rm
nesse nome.
(Postagem no blog Remover todos os arquivos “ausentes” de uma cópia de trabalho SVN faz algo semelhante para Unix / Linux.)
svn up
? porque os arquivos são restaurados a partir do servidor svn
Se você estiver usando Mac ( Darwin ) ou Linux, poderá canalizar as saídas dos seguintes comandos svn rm
para 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.
svn rm
usando a saída de # 3 como argumentosPortanto, o comando completo é:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Referências:
awk '{print " --force "$2"@"}'
se o seu nome de arquivo contiver um @
(se você é um desenvolvedor iOS, por exemplo)
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
deve fazer o truque (e começa a parecer feio)
--force
parte xargs?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
cada arquivo-r
às xargs
opçõ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 \n
como delimitador e deixe a citação para xargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Acabei de encontrar isso, que faz o truque, Remova todos os arquivos "ausentes" de uma cópia de trabalho do SVN :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
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.list
arquivo 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
del missing.list 2>NUL
, porque eu adicionei todos os novos arquivos diretamente após remover os arquivos excluídos pela primeira vez, missing.list
para adicionar ao svn: svn delete "missing.list"
funcionou comigo
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)
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
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
Na verdade, é possível remover completamente o missing.list
user3689460 e Paul Martin
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
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