Come faccio ad "svn aggiungere" tutti i file non controllati su SVN?


177

Sto cercando un buon modo per "svn aggiungere" automaticamente tutti i file non controllati in una copia funzionante nel mio repository SVN.

Ho un server live che può creare alcuni file che dovrebbero essere sotto il controllo del codice sorgente. Vorrei avere un breve script che posso eseguire per aggiungerli automaticamente, invece di esaminarli e aggiungerli uno alla volta.

Il mio server esegue Windows Server 2003, quindi una soluzione Unix non funzionerà.


1
@Saul Questa domanda precede chiaramente quella che hai collegato, quindi non vedo come possa essere un duplicato. Semmai l'altra domanda è il duplicato.
Neutrino,

Cygwin è un'opzione. Ti dà la potenza di bash su qualsiasi ambiente Windows. Sono stato un utente per oltre 10 anni con problemi molto lievi.
user151841

Risposte:


346

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

Ottimo consiglio! Un'osservazione: il mio Eclipse aggiunge automaticamente nuovi file all'elenco ignora. Potrebbe essere una questione di configurazione, ma comunque: c'è l' --no-ignoreopzione che aiuta.

Dopo questo, puoi impegnarti:

svn commit -m 'Adding a file'

14
Ottimo consiglio Molto meglio dell'uso dello stato svn. "svn add --force" sembra essere sufficiente.
Nome

1
C'è un modo semplice per impostare questo su una macro abbreviata (cioè, come puoi con git)? Inoltre, sarebbe possibile aggiornare questa risposta in modo che spieghi ogni bit?
MrDuk,

2
@MrDuk: abbreviato: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Spiegato:svn help add
Ronan

17
Il problema è che aggiunge i file ignorati corretti? Non desiderabile.
Ladieu,

1
@Name - devi metterlo *alla fine, altrimenti non funzionerebbe (in affitto per me)
vsync

72

Questa è una domanda diversa dalla mia, ma c'è una risposta che appartiene a questa domanda:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
Questo utilizza strumenti UNIX (grep, sed, bash) che l'OP ha affermato di non avere.
Naaff,

3
inoltre potresti probabilmente scavare sed e grep su Windows se lo desideri davvero.
Sam Saffron,

1
Mi dispiace per quel voto sul commento di Cygwin, non è stato intenzionale (e non posso annullarlo). In effetti penso che Cygwin sia il più brutto che puoi ottenere su Windows. Puoi ancora usare findstr invece di grep che funzionerà almeno da Windows 2000 senza installare nulla di aggiuntivo.
Joey,


2
Sono con mbyrne215; questa risposta mi ha aiutato più della soluzione del PO, quindi la sto votando. Funziona perfettamente con OS X 10.6.7.
Asbjørn Ulsberg,

37

Ciò che funziona è questo:

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

Aggiunge il contenuto delle sottodirectory.

Non aggiunge file ignorati.

Elenca quali file sono stati aggiunti.

Il punto nel comando indica la directory corrente, che può essere sostituita da un nome di directory o percorso specifico se si desidera aggiungere una directory diversa da quella corrente.


In realtà dovrebbe essere .\*o se svn root si trova su una directory diversa stuff\svn_root\*.
Nux,

Non seguo I comandi per SVN vengono eseguiti nel contesto del percorso da cui vengono eseguiti, questo è prevedibile. "svn add. \ *" da solo non ricorre e stampa un carico di avvisi di spam rendendo impossibile vedere ciò che è stato effettivamente aggiunto. "svn add. \ * --force" ricorre ma stampa anche "svn: Salto dell'argomento: E200025: '. \. svn' termina con un nome riservato". Quindi sembra peggio della mia soluzione originale.
Neutrino,

Stavo sottolineando che probabilmente non hai l'intero disco C su SVN ;-), e quindi dovresti aggiungere un percorso. E dai miei test specificando il percorso in quanto stuff\svn_rootnon aggiunge file nelle sottodirectory (ad es stuff\svn_root\already_in_svn\not_in_svn.txt. In). Da qui la stella alla fine.
Nux,

@Nux Solo ora dopo tutti questi anni finalmente vedo cosa stavi ottenendo :) Nel comando il punto è il percorso che specifica la directory corrente. Naturalmente è possibile fornire qualsiasi alternativa valida.
Neutrino,

Questa è la risposta esatta. Non sono sicuro di come una soluzione che include l'aggiunta di file ignorati abbia il primo posto. @Neutrino, suggerisci di rimuovere il tuo commento a Joey che non appare più in questa pagina, e aggiungi anche una riga che rafforza il fatto che il tuo suggerimento NON aggiunge file ignorati
b_levitt

35

Questo ha funzionato per me:

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

( Fonte )

Dato che hai già risolto il tuo problema con Windows, questa è una soluzione UNIX (che segue Sam). Ho aggiunto qui perché penso che sia ancora utile per coloro che raggiungono questa domanda chiedendo la stessa cosa (poiché il titolo non include la parola chiave "WINDOWS").

Nota (febbraio 2015): come commentato da "bdrx", il comando sopra potrebbe essere ulteriormente semplificato in questo modo:

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
Bello, compatto, conciso, si presta anche abbastanza bene all'estensione. Grazie.
Norman H,

1
Grande. Anche facile da espandere, modificare per eliminare ecc.
Drewid

Perfetto per quello di cui avevo bisogno. Grazie!
Jeff,

2
Perché le persone fanno sempre grep e poi pipe per awk? Awk può fare pattern matching: awk '/^[?]/{print $2}'; Non è necessario il processo extra grep.
bdrx,

1
@bdrx: Forse perché grep è comunemente associato alla corrispondenza dei pattern? Nel mio caso personale, ho molta più esperienza con grep che con awk. Non sapevo che potresti fare cose del genere in awk, quindi inizierò a usare awk di più nei miei script. Grazie!
lepe,

5
svn add --force .

Ciò aggiungerà qualsiasi file non verificato nella directory corrente e tutte le directory figlio con versione.


5

Questo metodo dovrebbe gestire i nomi di file che contengono qualsiasi numero / combinazione di spazi ...

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

Ecco una spiegazione di ciò che fa quel comando:

  • Elenca tutti i file modificati.
  • Limita questo elenco alle righe con '?' all'inizio - ovvero nuovi file.
  • Rimuovi il '?' carattere all'inizio della riga.
  • Rimuovi gli spazi all'inizio della riga.
  • Installa i nomi dei file in xargs per eseguire svn add più volte.

Usa l'argomento -i per xargs per gestire la possibilità di importare nomi di file con spazi in 'svn add' - in pratica, -i imposta {} da usare come segnaposto in modo da poter mettere i "caratteri attorno al nome file usato da 'svn Inserisci'.

Un vantaggio di questo metodo è che questo dovrebbe gestire nomi di file con spazi al loro interno.


Ciò presuppone Linux o simili (ad esempio MinGW o Cygwin ). L'OP ha dichiarato: "Il mio server esegue Windows Server 2003, quindi una soluzione Unix non funzionerà".
Peter Mortensen,

4

TortoiseSVN ha questa funzionalità integrata, se si desidera utilizzare una soluzione non a riga di comando. Basta fare clic con il tasto destro sulla cartella di livello superiore e selezionare Aggiungi ...


Con un enorme repository, TortoiseSVN si blocca. Questo mi ha fatto cercare alternative alla riga di comando :-)
Upendra


3

Uso:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
Oppure puoi usare cut per fare il lavoro di grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3,

Ciò presuppone Linux o simili (ad esempio MinGW o Cygwin ). L'OP ha dichiarato: "Il mio server esegue Windows Server 2003, quindi una soluzione Unix non funzionerà".
Peter Mortensen,

3

Uso sempre:

Copia incolla

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op explicity afferma che una soluzione Unix non gli serve.
Neutrino,

Ciò presuppone Linux o simili (ad esempio MinGW o Cygwin ). L'OP ha dichiarato: "Il mio server esegue Windows Server 2003, quindi una soluzione Unix non funzionerà".
Peter Mortensen,

3

Dato che questo post è taggato su Windows, ho pensato di trovare una soluzione per Windows. Volevo automatizzare il processo e ho creato un file bat. Ho resistito a creare un console.exe in C #.

Volevo aggiungere eventuali file o cartelle che non sono stati aggiunti nel mio repository quando inizio il processo di commit.

Il problema con molte delle risposte è che elencheranno i file non controllati che dovrebbero essere ignorati secondo la mia lista da ignorare in TortoiseSVN .

Ecco la mia impostazione hook e il file batch che lo fa

Script di 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"

All'interno di questa implementazione, avrai problemi nel caso in cui le tue cartelle / nomi di file abbiano più di uno spazio come di seguito:

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

tali casi sono coperti da semplici:

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

2

Se usi Linux o usi Cygwin o MinGW in Windows puoi usare soluzioni simili a bash come le seguenti. In contrasto con altri simili simili qui presentati, questo prende in considerazione gli spazi dei nomi dei file:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

A cosa serve? CMD? Bash? Sembra Bash (o una shell simile). In tal caso, presuppone Linux o simili (ad esempio MinGW o Cygwin ). L'OP ha dichiarato: "Il mio server esegue Windows Server 2003, quindi una soluzione Unix non funzionerà".
Peter Mortensen,

Grazie, hai ragione, quando sono in Windows uso Cygwin con Bash. Tuttavia, la frase "Il mio server esegue Windows Server 2003, quindi una soluzione Unix non funzionerà". è falso. Forse non vuole usare Cygwin o MinGW, ma non si è espresso in questo modo. Ho riformulato la risposta.
ajaest

1

Dopo aver trascorso un po 'di tempo cercando di capire come aggiungere ricorsivamente solo alcuni dei file, ho pensato che sarebbe stato valido condividere ciò che ha funzionato per me:

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"

Ecco alcune spiegazioni.

Il primo comando aggiunge tutte le directory. Il secondo comando aggiunge solo i file di conseguenza ai modelli specificati.

Lasciami dare maggiori dettagli:

  • FOR: sai, il controllo del loop.
  • / F: significa prendere i file e le directory (non sono sicuro esattamente).
  • % F: è una variabile; assumerà il valore di ciascuno dei file elencati alla volta; potrebbe avere un altro nome di un carattere.
  • IN: non c'è bisogno di spiegare, giusto?
  • ('dir / s / b / a: d'): il comando DOS che elencherà le directory; nel mio caso / i è ricorsivo, / b è quello di prendere solo il percorso completo, / a: d significa solo la directory; cambiarlo come si desidera mantenendo la parentesi e gli apostrofi.
  • DO: significa che ciò che verrà dopo nel comando è ciò che verrà eseguito per ogni directory
  • svn add --depth = vuoto: è il comando SVN desiderato da eseguire; la definizione di profondità significa aggiungere solo la directory e non i file al loro interno.
  • "% F": è così che usi la variabile definita in precedenza.

Nel secondo comando, le uniche differenze sono il comando dir e il comando svn, penso che sia abbastanza chiaro.


0

Puoi usare il comando

svn add * force--

o

svn add <directory/file name>

Se i tuoi file / directory non vengono aggiunti in modo ricorsivo. Quindi controlla questo.

L'aggiunta ricorsiva è la proprietà predefinita . Puoi vedere nel libro SVN .

Il problema può essere presente nell'elenco ignorato o nelle proprietà globali.

Ho trovato la soluzione tracker di problemi di Google

Controlla le proprietà globali per ignorare la stella (*)

  • Fai clic con il tasto destro del mouse sul repository nella finestra. Selezionare TortoiseSVN > Properties.
  • Vedi se non hai una proprietà svn:global-ignores with a value of *
  • Se hai proprietà con star(*)allora ignorerà l'aggiunta ricorsiva. Quindi rimuovere questa proprietà.

Controlla il modello globale di ignore per ignorare la stella (*)

  • Fai clic con il tasto destro del mouse sul repository nella finestra. Selezionare TortoiseSVN > Settings > General.
  • Vedi in Global Ignore Pattern, se non hai impostato star (*) lì.
  • Se hai trovato star(*), rimuovi questa proprietà.

Questo ragazzo ha anche spiegato perché questa proprietà è stata aggiunta nel mio progetto.

Il modo più simile che ci è arrivato è che qualcuno ha fatto clic con il pulsante destro del mouse su un file senza alcuna estensione e ha selezionato TortoiseSVN -> SVN Ignore -> * (ricorsivamente), quindi ha eseguito il commit.

Puoi controllare il registro per vedere chi ha commesso quel cambiamento di proprietà, scoprire cosa stavano effettivamente cercando di fare e chiedere loro di stare più attenti in futuro. :)


0

È possibile immettere il seguente comando su Linux:

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

0

Da quando ha specificato Windows, dove awk e sed non sono standard:

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

o in un file batch:

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

0

Questo è il modo pigro e pericoloso per sincronizzare una directory con SVN inclusi i nuovi file:

svn rm --keep-local dir
svn add dir

Anche se questo può funzionare in un attimo, può anche avere gravi conseguenze. Ad esempio, SVN perderà spesso traccia della cronologia di un file.

Il modo ideale per sincronizzare una directory sarebbe quello di essere in grado di diff quindi utilizzare la patch svn, tuttavia questo si discosta dai formati nel comando diff e il comando svn diff confronterà le differenze della directory di lavoro piuttosto che le differenze a livello di file system.


-1

Penso di aver fatto qualcosa di simile con:

svn add . --recursive

ma non sono sicuro che la mia memoria sia corretta ;-p


2
solo un aggiornamento per la tua memoria: svn 1.4 e 1.5 non supportano - ricorsivo come parametro per svn add :)
Ludwig Wensauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.