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:
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.
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.
Executar um status svn
Procure por linhas que começam com "!" (ausência de)
Imprima o "--force" (argumento svn) e a segunda coluna (o nome do arquivo) da saída do # 2
Executar svn rmusando a saída de # 3 como argumentos
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
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
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)
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
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
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:
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.)
fonte
svn up
? porque os arquivos são restaurados a partir do servidor svnSe 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 é:
Referências:
fonte
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 status
svn remove
cada arquivofonte
-r
àsxargs
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 paraxargs
: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 :
fonte
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.
fonte
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 comigoEu gosto da opção PowerShell ... Mas aqui está outra opção se você estiver usando scripts em lote do Windows:
fonte
Uma alternativa que funciona no Linux (bash) para arquivos a serem removidos que não contêm espaços no caminho:
fonte
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".fonte
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:
fonte
Na verdade, é possível remover completamente o
missing.list
user3689460 e Paul Martinfonte
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:
fonte
Versão melhorada
Portanto, o comando completo é:
fonte