it-swarm.com.de

Wie füge ich "svn" alle nicht versionierten Dateien zu SVN hinzu?

Ich suche nach einer guten Möglichkeit, alle unversionierten Dateien in einer Arbeitskopie automatisch in mein SVN-Repository zu kopieren. 

Ich habe einen Live-Server, der einige Dateien erstellen kann, die der Quellcodeverwaltung unterliegen sollten. Ich hätte gerne ein kurzes Skript, das ich ausführen kann, um diese automatisch hinzuzufügen, anstatt sie einzeln durchzusehen.

Mein Server läuft unter Windows Server 2003 , damit eine Unix-Lösung nicht funktioniert.

168
JerSchneid

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

Toller Tipp! Eine Bemerkung: Mein Eclipse fügt automatisch neue Dateien zur Ignorierliste hinzu. Es kann eine Frage der Konfiguration sein, aber trotzdem: Die --no-ignore-Option hilft.

Danach können Sie festlegen:

svn commit -m 'Adding a file'
339
Ronan

Dies ist eine andere Frage zu meiner , aber es gibt eine Antwort auf diese Frage:

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

Was funktioniert, ist folgendes:

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

Fügt den Inhalt von Unterverzeichnissen hinzu.

Fügt keine ignorierten Dateien hinzu.

Listet auf, welche Dateien hinzugefügt wurden.

Der Punkt im Befehl gibt das aktuelle Verzeichnis an. Dieses kann durch einen bestimmten Verzeichnisnamen oder Pfad ersetzt werden, wenn Sie ein anderes Verzeichnis als das aktuelle hinzufügen möchten.

36
Neutrino

Das hat für mich funktioniert:

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

( Quelle )

Da Sie Ihr Problem für Windows bereits gelöst haben, handelt es sich hierbei um eine UNIX-Lösung (nach Sam). Ich fügte hier hinzu, da ich denke, dass es immer noch nützlich ist für diejenigen, die zu dieser Frage kommen und dasselbe verlangen (da der Titel nicht das Stichwort "WINDOWS" enthält).

Note (Feb 2015): Wie von "bdrx" kommentiert, könnte der obige Befehl auf diese Weise weiter vereinfacht werden:

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

Diese Methode sollte Dateinamen behandeln, die eine beliebige Anzahl/Kombination von Leerzeichen enthalten ...

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

Hier ist eine Erklärung, was dieser Befehl bewirkt:

  • Alle geänderten Dateien auflisten. 
  • Diese Liste auf Zeilen mit '?' Beschränken am Anfang - d. h. neue Dateien. 
  • Entferne das '?' Zeichen am Anfang der Zeile. 
  • Entfernen Sie die Leerzeichen am Anfang der Zeile. 
  • Pipe die Dateinamen in xargs, um svn add mehrmals auszuführen. 

Verwenden Sie das Argument -i für xargs, um in der Lage zu sein, Dateinamen mit Leerzeichen in 'svn add' zu importieren hinzufügen'.

Ein Vorteil dieser Methode besteht darin, dass Dateinamen mit Leerzeichen behandelt werden sollten.

5
bailey86

TortoiseSVN hat diese Funktion eingebaut, wenn Sie eine Lösung ohne Befehlszeile verwenden möchten. Klicken Sie einfach mit der rechten Maustaste auf den Ordner der obersten Ebene und wählen Sie Hinzufügen ...

4
John Meagher

Ich verwende immer:

Kopieren Einfügen

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
3
Oritm
svn add --force .

Dadurch werden alle nicht versionierten Dateien im aktuellen Verzeichnis und allen versionierten untergeordneten Verzeichnissen hinzugefügt.

3
jmc734

Dies ist, wie in svn book dokumentiert, das einfachste und funktioniert perfekt für mich

svn add * --force

http://svnbook.red-bean.com/de/1.6/svn.ref.svn.c.add.html

3
Serjik

Da dieser Beitrag mit Windows markiert ist, dachte ich, ich würde eine Lösung für Windows ausarbeiten. Ich wollte den Prozess automatisieren und eine Bat-Datei erstellen. Ich habe mich geweigert, eine console.exe in C # zu erstellen.

Ich wollte alle Dateien oder Ordner hinzufügen, die nicht zu meinem Repository hinzugefügt werden, wenn ich mit dem Festschreibungsprozess beginne.

Das Problem bei vielen Antworten ist, dass sie unversionierte Dateien auflisten, die gemäß meiner Ignorierliste in TortoiseSVN . Ignoriert werden sollten.

Hier ist meine Hook-Einstellung und Batch-Datei, die das tut

Tortoise Hook Script:

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

Benutzen:

svn st | grep ? | cut -d? -f2 | xargs svn add
3
Xiè Jìléi

Wenn Sie Linux verwenden oder Cygwin oder MinGW unter Windows verwenden, können Sie bash-ähnliche Lösungen wie die folgenden verwenden. Im Gegensatz zu anderen hier vorgestellten ähnlichen, werden hier Dateinamensbereiche berücksichtigt:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done
2
ajaest
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

Innerhalb dieser Implementierung werden Sie in Schwierigkeiten geraten, wenn Ihre Ordner/Dateinamen mehr als einen Speicherplatz wie unten enthalten:

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

solche Fälle werden durch einfache abgedeckt:

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

Nachdem ich einige Zeit damit verbracht hatte, herauszufinden, wie man nur einige der Dateien rekursiv hinzufügt, dachte ich, es wäre richtig, zu teilen, was für mich funktioniert:

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"

Hier eine Erklärung.

Der erste Befehl fügt alle Verzeichnisse hinzu. Der zweite Befehl fügt nur die Dateien entsprechend den angegebenen Mustern hinzu.

Lassen Sie mich mehr Details geben:

  • FOR: Sie wissen, die Schleifensteuerung.
  • / F: bedeutet, die Dateien und Verzeichnisse zu nehmen (nicht genau sicher).
  • % F: es ist eine Variable; Es nimmt jeweils den Wert aller aufgelisteten Dateien an. Es könnte einen anderen Ein-Zeichen-Namen haben.
  • IN: keine Notwendigkeit zu erklären, richtig?
  • ('dir/s/b/a: d'): der DOS-Befehl, der die Verzeichnisse auflistet; In meinem Fall ist/s rekursiv,/b soll nur den vollständigen Pfad verwenden,/a: d bedeutet nur das Verzeichnis; Ändern Sie es so, wie Sie es wünschen, die Klammern und Apostrophe.
  • DO: bedeutet, dass das, was als nächstes kommt, das ist, was für jedes Verzeichnis ausgeführt wird
  • svn add --depth = empty: es ist das gewünschte SVN-Kommando, das ausgeführt werden soll; Die Tiefendefinition bedeutet, nur das Verzeichnis und nicht die darin enthaltenen Dateien hinzuzufügen.
  • "% F": So verwenden Sie die zuvor definierte Variable.

Im zweiten Befehl sind der einzige Unterschied der Befehl dir und der Befehl svn. Ich denke, es ist klar genug.

1
heringer

Sie können den folgenden Befehl unter Linux eingeben:

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

Da er Windows spezifizierte, wo awk & sed nicht Standard sind

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

oder in einer Batchdatei:

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

Sie können den Befehl verwenden

svn add * force--

oder 

svn add <directory/file name>

Wenn Ihre Dateien/Verzeichnisse nicht rekursiv hinzugefügt werden. Dann überprüfen Sie das.

Rekursives Hinzufügen ist die Standardeigenschaft. Sie können in SVN Buch sehen.

Das Problem kann sich in Ihrer Ignorierliste oder in globalen Eigenschaften befinden. 

Ich habe Lösung Google Issue Tracker

Globale Eigenschaften prüfen, um Stern (*) zu ignorieren

  • Klicken Sie mit der rechten Maustaste in Ihr Repo-Fenster. Wählen Sie TortoiseSVN > Properties.
  • Prüfen Sie, ob Sie keine Eigenschaft haben svn:global-ignores with a value of *
  • Wenn Sie über eine Eigenschaft mit star(*) verfügen, wird das rekursive Hinzufügen ignoriert. Also entfernen Sie diese Eigenschaft.

Überprüfen Sie das globale Ignoriermuster, um den Stern zu ignorieren (*)

  • Klicken Sie mit der rechten Maustaste in Ihr Repo-Fenster. Wählen Sie TortoiseSVN > Settings > General.
  • Siehe unter Globales Ignoriermuster, wenn dort nicht star (*) gesetzt ist.
  • Wenn Sie star(*) gefunden haben, entfernen Sie diese Eigenschaft.

Dieser Typ erklärte auch warum diese Eigenschaft in mein Projekt aufgenommen wurde.

Am ehesten kam es dazu, dass jemand mit der rechten Maustaste auf eine Datei ohne Erweiterung geklickt und TortoiseSVN -> SVN Ignore -> * (rekursiv) ausgewählt und diese dann festgeschrieben hat. 

Sie können das Protokoll überprüfen, um festzustellen, wer diese Eigenschaftsänderung vorgenommen hat. herausfinden, was sie tatsächlich versucht haben, und bitten sie, mehr zu sein Vorsicht in der Zukunft. :)

0
Khemraj