Como 'svn adiciono' todos os arquivos não versionados ao SVN?

177

Estou procurando uma boa maneira de 'svn add' automaticamente todos os arquivos não versionados em uma cópia de trabalho no meu repositório SVN.

Eu tenho um servidor ativo que pode criar alguns arquivos que devem estar sob controle de origem. Eu gostaria de ter um script curto que eu possa executar para adicioná-los automaticamente, em vez de passar e adicioná-los um de cada vez.

Meu servidor está executando o Windows Server 2003, portanto, uma solução Unix não funcionará.

JerSchneid
fonte
1
@Saul Esta pergunta é claramente anterior à que você vinculou, então não vejo como ela pode ser uma duplicata. Se alguma coisa a outra pergunta é a duplicata.
Neutrino
Cygwin é uma opção. Dá a você o poder do bash em qualquer ambiente do Windows. É usuário há mais de 10 anos com problemas muito menores.
precisa saber é o seguinte

Respostas:

346

svn add --force * --auto-props --parents --depth infinity -q

Ótima dica! Uma observação: meu Eclipse adiciona novos arquivos à lista de ignorados automaticamente. Pode ser uma questão de configuração, mas de qualquer maneira: existe a --no-ignoreopção que ajuda.

Depois disso, você pode confirmar:

svn commit -m 'Adding a file'
Ronan
fonte
14
Ótima dica. Muito melhor do que usar o status svn. "svn add --force" parece ser suficiente.
Nome
1
Existe uma maneira fácil de definir isso para uma macro reduzida (ou seja, como você pode com o git)? Além disso, seria possível atualizar esta resposta para que ela explique cada bit?
21414 MrDuk
2
@MrDuk: Encurtado: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Explicado:svn help add
Ronan
17
Problema é isso adiciona arquivos ignorados correto? Não é desejável.
ladieu
1
@Name - você precisa colocar *no final, então ele não iria funcionar (pelo contrato de arrendamento para mim)
vsync
72

Esta é uma pergunta diferente da minha, mas há uma resposta que pertence a esta pergunta:

svn status | grep '?' | sed 's/^.* /svn add /' | bash
Sam Saffron
fonte
8
Isso usa ferramentas UNIX (grep, sed, bash) que o OP disse que não tinha.
Naaff
3
Além disso, você provavelmente poderia desenterrar sed e grep no Windows, se realmente quisesse.
Sam Saffron
1
Desculpe pelo voto positivo no comentário do cygwin, não foi intencional (e não posso desfazê-lo). Na verdade, acho que o cygwin é o mais feio possível no Windows. Você ainda pode usar o findstr em vez do grep, que funcionará pelo menos desde o Windows 2000 sem instalar nada adicional.
Joey
@Johannes just for you meta.stackexchange.com/questions/1775/…
Sam Saffron #
2
Estou com mbyrne215; essa resposta me ajudou mais do que a solução do OP, então estou votando. Funciona perfeitamente no OS X 10.6.7.
Asbjørn Ulsberg 29/03
37

O que funciona é isso:

c:\work\repo1>svn add . --force

Adiciona o conteúdo dos subdiretórios.

Não adiciona arquivos ignorados.

Lista quais arquivos foram adicionados.

O ponto no comando indica o diretório atual, que pode ser substituído por um nome ou caminho de diretório específico, se você desejar adicionar um diretório diferente do atual.

Neutrino
fonte
Na verdade, deve ser .\*ou se o svn root estiver em um diretório diferente stuff\svn_root\*.
Nux
Eu não sigo. Comandos para SVN executados no contexto do caminho a partir do qual são executados, isso é de se esperar. "svn add. \ *" por si só não se repete e imprime uma carga de spam de aviso, impossibilitando ver o que realmente foi adicionado. "svn add. \ * --force" é repetido, mas também imprime "svn: Ignorando argumento: E200025: '. \. svn' termina em um nome reservado". Então isso parece pior do que minha solução original.
Neutrino
Eu estava apontando que você provavelmente não tem uma unidade C inteira no SVN ;-) e, portanto, deve adicionar um caminho. E do meu caminho de especificação de teste, como stuff\svn_rootnão adiciona arquivos em subdiretórios (por exemplo, em stuff\svn_root\already_in_svn\not_in_svn.txt). Daí a estrela no final.
Nux
@ Nux Somente agora, depois de todos esses anos, finalmente vejo o que você estava recebendo :) No comando, o ponto é o caminho que especifica o diretório atual. Naturalmente, qualquer alternativa válida pode ser fornecida.
Neutrino
Esta é a resposta certa. Não sei ao certo como uma solução que inclui a adição de arquivos ignorados tem o primeiro lugar. @Neutrino, sugerem remover o seu comentário para Joey que já não aparece nesta página, e também adicionar uma linha reforçando que sua sugestão não adiciona arquivos ignorados
b_levitt
35

Isso funcionou para mim:

svn add `svn status . | grep "^?" | awk '{print $2}'`

( Fonte )

Como você já resolveu seu problema para o Windows, esta é uma solução UNIX (após o Sam). Eu adicionei aqui, pois acho que ainda é útil para quem chega a essa pergunta solicitando a mesma coisa (pois o título não inclui a palavra-chave "WINDOWS").

Nota (fev 2015): Conforme comentado por "bdrx", o comando acima pode ser mais simplificado desta maneira:

 svn add `svn status . | awk '/^[?]/{print $2}'`
lepe
fonte
1
Bonito, compacto, conciso, também se presta à extensão muito bem. Obrigado.
Norman H
1
Ótimo. Também fácil de expandir, modificar excluir etc.
Drewid
Perfeito para o que eu precisava. Obrigado!
21412 Jeff
2
Por que as pessoas sempre cumprimentam e depois passam para o awk? Awk pode fazer a correspondência de padrão: awk '/^[?]/{print $2}'; Não há necessidade do processo grep extra.
bdrx
1
@bdrx: Talvez porque o grep seja comumente associado à correspondência de padrões? No meu caso pessoal, sou muito mais experiente com grep do que com awk. Eu não sabia que você poderia fazer essas coisas no awk, então começarei a usar mais o awk nos meus scripts. Obrigado!
Lepe
5
svn add --force .

Isso adicionará qualquer arquivo não versionado no diretório atual e todos os diretórios filhos com versão.

jmc734
fonte
5

Este método deve lidar com nomes de arquivos com qualquer número / combinação de espaços neles ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

Aqui está uma explicação do que esse comando faz:

  • Listar todos os arquivos alterados.
  • Limite esta lista a linhas com '?' no início - ou seja, novos arquivos.
  • Remova o '?' caractere no início da linha.
  • Remova os espaços no início da linha.
  • Canalize os nomes dos arquivos no xargs para executar o svn add várias vezes.

Use o argumento -i para xargs, para poder importar nomes de arquivos com espaços para 'svn add' - basicamente, -i define {} para ser usado como espaço reservado para que possamos colocar os "caracteres ao redor do nome do arquivo usado por 'svn adicionar'.

Uma vantagem desse método é que ele deve lidar com nomes de arquivos com espaços neles.

bailey86
fonte
Isso pressupõe Linux ou similar (por exemplo, MinGW ou Cygwin ). O OP declarou: "Meu servidor está executando o Windows Server 2003, portanto, uma solução Unix não funcionará".
Peter Mortensen
4

O TortoiseSVN possui esse recurso incorporado, se você estiver disposto a usar uma solução que não seja da linha de comando. Apenas clique com o botão direito do mouse na pasta de nível superior e selecione Adicionar ...

John Meagher
fonte
Com um enorme repositório, o TortoiseSVN trava. Isso me fez procurar alternativas de linha de comando :-)
Upendra 14/03
3

Usar:

svn st | grep ? | cut -d? -f2 | xargs svn add
Xiè Jìléi
fonte
1
Ou você pode usar corte para fazer o trabalho de grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3
Isso pressupõe Linux ou similar (por exemplo, MinGW ou Cygwin ). O OP declarou: "Meu servidor está executando o Windows Server 2003, portanto, uma solução Unix não funcionará".
Peter Mortensen
3

Eu sempre uso:

Copiar colar

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
Oritm
fonte
1
Op explicity afirma que uma solução Unix não é útil para ele.
Neutrino
Isso pressupõe Linux ou similar (por exemplo, MinGW ou Cygwin ). O OP declarou: "Meu servidor está executando o Windows Server 2003, portanto, uma solução Unix não funcionará".
Peter Mortensen
3

Como esta postagem está marcada como Windows, pensei em encontrar uma solução para o Windows. Eu queria automatizar o processo e criei um arquivo bat. Resisti a criar um console.exe em C #.

Eu queria adicionar quaisquer arquivos ou pastas que não sejam adicionados ao meu repositório quando eu iniciar o processo de confirmação.

O problema com muitas das respostas é que eles listarão arquivos não-versionados que devem ser ignorados conforme minha lista de ignorados no TortoiseSVN .

Aqui está a minha configuração de gancho e arquivo em lote que faz isso

Script de gancho de tartaruga:

"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script

svnadd.bat

@echo off

rem Iterates each line result from the command which lists files/folders
rem     not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end

:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem    quotes from the G call (as required for long folder names). Then
rem    place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%

:end
Valamas
fonte
2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

Nessa implementação, você terá problemas caso suas pastas / nomes de arquivos tenham mais de um espaço, como abaixo:

"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"

tais casos são cobertos por simples:

for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"
olexa
fonte
2

Se você usa Linux ou Cygwin ou MinGW no Windows, pode usar soluções semelhantes ao bash, como a seguir. Contrastando com outros similares apresentados aqui, este leva em consideração os espaços de nome de arquivo:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done
ajaest
fonte
Para que serve isso? CMD? Bash? Parece Bash (ou um shell semelhante). Nesse caso, ele pressupõe Linux ou similar (por exemplo, MinGW ou Cygwin ). O OP declarou: "Meu servidor está executando o Windows Server 2003, portanto, uma solução Unix não funcionará".
Peter Mortensen
Obrigado, você está certo. Quando estou no Windows, uso o Cygwin with Bash. No entanto, a declaração "Meu servidor está executando o Windows Server 2003, portanto, uma solução Unix não funcionará". é falso. Talvez ele não queira usar Cygwin ou MinGW, mas não se expressou dessa maneira. Eu reformulei a resposta.
Ajaest
1

Depois de passar algum tempo tentando descobrir como adicionar recursivamente apenas alguns dos arquivos, pensei que seria válido compartilhar o que funcionou para mim:

FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"

Aqui vai uma explicação.

O primeiro comando adiciona todos os diretórios. O segundo comando adiciona apenas os arquivos de acordo com os padrões especificados.

Deixe-me dar mais detalhes:

  • FOR: você sabe, o controle de loop.
  • / F: significa pegar os arquivos e diretórios (não tenho certeza exatamente).
  • % F: é uma variável; assumirá o valor de cada um dos arquivos listados por vez; poderia ter outro nome de um caractere.
  • IN: não precisa explicar, certo?
  • ('dir / s / b / a: d'): o comando do DOS que listará os diretórios; no meu caso / s é recursivo, / b é apenas o caminho completo, / a: d significa apenas o diretório; altere-o conforme desejar, mantendo o parêntese e o apóstrofo.
  • DO: significa que o que vem a seguir no comando é o que será executado para cada diretório
  • svn add --depth = empty: é o comando SVN desejado a ser executado; a definição de profundidade significa adicionar apenas o diretório e não os arquivos dentro deles.
  • "% F": é assim que você usa a variável definida anteriormente.

No segundo comando, as únicas diferenças são o comando dir e o comando svn, acho que é claro o suficiente.

heringer
fonte
0

Você pode usar o comando

svn add * force--

ou

svn add <directory/file name>

Se seus arquivos / diretórios não estiverem adicionando recursivamente. Então verifique isso.

A adição recursiva é propriedade padrão . Você pode ver no livro SVN .

O problema pode estar na sua lista de ignorados ou nas propriedades globais.

Tenho solução rastreador de problemas do google

Verifique as propriedades globais para ignorar as estrelas (*)

  • Clique com o botão direito do mouse no seu repo na janela. Selecione TortoiseSVN > Properties.
  • Veja se você não tem uma propriedade svn:global-ignores with a value of *
  • Se você tiver propriedade com star(*), ele ignorará a adição recursiva. Portanto, remova essa propriedade.

Verifique o padrão de ignição global para ignorar as estrelas (*)

  • Clique com o botão direito do mouse no seu repo na janela. Selecione TortoiseSVN > Settings > General.
  • Veja no Global Ignore Pattern, se você não definiu uma estrela (*) lá.
  • Se você encontrou star(*), remova esta propriedade.

Esse cara também explicou por que essa propriedade foi adicionada ao meu projeto.

A maneira mais parecida com isso foi que alguém clicou com o botão direito do mouse em um arquivo sem nenhuma extensão e selecionou TortoiseSVN -> SVN Ignore -> * (recursivamente) e, em seguida, o fez.

Você pode verificar o log para ver quem cometeu essa alteração de propriedade, descobrir o que eles estavam realmente tentando fazer e pedir que eles sejam mais cuidadosos no futuro. :)

Khemraj
fonte
0

Você pode inserir o seguinte comando no Linux:

find ./ -name "*." | xargs svn add
liu zhijun
fonte
0

Desde que ele especificou o Windows, onde awk & sed não são padrão:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

ou em um arquivo em lotes:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"
WLH
fonte
0

Esta é a maneira lenta e perigosa de sincronizar um diretório com o SVN, incluindo novos arquivos:

svn rm --keep-local dir
svn add dir

Embora isso possa funcionar muito bem, também pode ter sérias conseqüências. Por exemplo, o SVN geralmente perde o controle do histórico de um arquivo.

A maneira ideal de sincronizar um diretório seria poder diferenciar e usar o patch svn, no entanto, isso se desvia dos formatos no comando diff e o comando svn diff comparará as diferenças do diretório de trabalho em vez das diferenças no nível do sistema de arquivos.

jgmjgm
fonte
-1

Eu acho que fiz algo semelhante com:

svn add . --recursive

mas não tenho certeza se minha memória está correta ;-p

chakrit
fonte
2
apenas uma atualização para sua memória: svn 1.4 e 1.5 não suportam --recursive como parâmetro para svn add :)
Ludwig Wensauer