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á.


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'

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

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


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.


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}'`

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.


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.


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 ...


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

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

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

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"

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

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.


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. :)


0

Você pode inserir o seguinte comando no Linux:

find ./ -name "*." | xargs svn add

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"

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.


-1

Eu acho que fiz algo semelhante com:

svn add . --recursive

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.