Wie füge ich alle nicht konvertierten Dateien zu SVN hinzu?

177

Ich suche nach einer guten Möglichkeit, alle nicht versionierten Dateien in einer Arbeitskopie automatisch zu meinem SVN-Repository hinzuzufügen.

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

Auf meinem Server wird Windows Server 2003 ausgeführt, sodass eine Unix-Lösung nicht funktioniert.

JerSchneid
quelle
1
@Saul Diese Frage ist eindeutig älter als die, die Sie verlinkt haben, daher sehe ich nicht, wie es sich um ein Duplikat handeln kann. Wenn überhaupt, ist die andere Frage das Duplikat.
Neutrino
Cygwin ist eine Option. Bietet Ihnen die Möglichkeit, in jeder Windows-Umgebung zu schlagen. Ich bin seit über 10 Jahren ein Benutzer mit sehr kleinen Problemen.
user151841

Antworten:

346

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

Toller Tipp! Eine Bemerkung: Meine Eclipse fügt der Ignorierliste automatisch neue Dateien hinzu. Es kann eine Frage der Konfiguration sein, aber trotzdem: Es gibt die --no-ignoreOption, die hilft.

Danach können Sie Folgendes festlegen:

svn commit -m 'Adding a file'
Ronan
quelle
14
Toller Tipp. Viel besser als die Verwendung des SVN-Status. "svn add --force" scheint ausreichend zu sein.
Name
1
Gibt es eine einfache Möglichkeit, dies auf ein verkürztes Makro zu setzen (dh wie Sie es mit git können)? Wäre es auch möglich, diese Antwort so zu aktualisieren, dass sie jedes Bit erklärt?
MrDuk
2
@ MrDuk: Verkürzt: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Erklärt:svn help add
Ronan
17
Problem ist, dass dies ignorierte Dateien korrekt hinzufügt? Nicht wünschenswert.
Ladieu
1
@ Name - Sie müssen *am Ende setzen, sonst würde es nicht funktionieren (
zumindest
72

Dies ist eine andere Frage als meine, aber es gibt dort eine Antwort, die zu dieser Frage gehört:

svn status | grep '?' | sed 's/^.* /svn add /' | bash
Sam Safran
quelle
8
Dies verwendet UNIX-Tools (grep, sed, bash), die das OP laut eigenen Angaben nicht hatte.
Naaff
3
Sie könnten wahrscheinlich auch sed und grep an Fenstern ausgraben, wenn Sie es wirklich wollten.
Sam Saffron
1
Entschuldigung für diese positive Bewertung des Cygwin-Kommentars, war nicht beabsichtigt (und ich kann es nicht rückgängig machen). Tatsächlich denke ich, dass Cygwin so hässlich ist, wie man es unter Windows bekommen kann. Sie können weiterhin findstr anstelle von grep verwenden, was mindestens seit Windows 2000 ohne zusätzliche Installation funktioniert.
Joey
@ Johannes nur für Sie meta.stackexchange.com/questions/1775/…
Sam Saffron
2
Ich bin bei mbyrne215; Diese Antwort hat mir mehr geholfen als die Lösung des OP, also stimme ich ab. Funktioniert perfekt in OS X 10.6.7.
Asbjørn Ulsberg
37

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. Dies kann durch einen bestimmten Verzeichnisnamen oder Pfad ersetzt werden, wenn Sie ein anderes Verzeichnis als das aktuelle hinzufügen möchten.

Neutrino
quelle
Eigentlich sollte das sein .\*oder wenn sich svn root in einem anderen Verzeichnis befindet stuff\svn_root\*.
Nux
Ich folge nicht. Befehle an SVN werden im Kontext des Pfades ausgeführt, von dem aus sie ausgeführt werden. Dies ist zu erwarten. "svn add. \ *" allein wird nicht wiederholt und druckt eine Menge Warn-Spam, sodass nicht angezeigt werden kann, was tatsächlich hinzugefügt wurde. "svn add. \ * --force" wird wiederholt, druckt aber auch "svn: Argument überspringen: E200025: '. \. svn' endet mit einem reservierten Namen". Das scheint also schlimmer zu sein als meine ursprüngliche Lösung.
Neutrino
Ich habe darauf hingewiesen, dass Sie wahrscheinlich nicht das gesamte C-Laufwerk auf SVN haben ;-), und deshalb sollten Sie einen Pfad hinzufügen. Und aus meinem Test, der den Pfad angibt, werden stuff\svn_rootkeine Dateien in Unterverzeichnissen hinzugefügt (z stuff\svn_root\already_in_svn\not_in_svn.txt. B. in ). Daher der Stern am Ende.
Nux
@Nux Erst jetzt, nach all den Jahren, sehe ich endlich, worauf du hinaus willst :) Im Befehl ist der Punkt der Pfad, der das aktuelle Verzeichnis angibt. Natürlich kann stattdessen jede gültige Alternative geliefert werden.
Neutrino
Dies ist die richtige Antwort. Ich bin mir nicht sicher, wie eine Lösung, die das Hinzufügen ignorierter Dateien umfasst, den ersten Platz belegt. @Neutrino, schlagen Sie vor, Ihren Kommentar zu joey zu entfernen, der nicht mehr auf dieser Seite erscheint, und fügen Sie eine Zeile hinzu, die bestätigt, dass Ihr Vorschlag KEINE ignorierten Dateien hinzufügt
b_levitt
35

Das hat bei mir funktioniert:

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

( Quelle )

Da Sie Ihr Problem für Windows bereits gelöst haben, handelt es sich um eine UNIX-Lösung (nach Sam). Ich habe hier hinzugefügt, da ich denke, dass es immer noch nützlich ist für diejenigen, die diese Frage erreichen und nach dem gleichen Thema fragen (da der Titel nicht das Schlüsselwort "WINDOWS" enthält).

Hinweis (Februar 2015): Wie von "bdrx" kommentiert, könnte der obige Befehl auf folgende Weise weiter vereinfacht werden:

 svn add `svn status . | awk '/^[?]/{print $2}'`
Lepe
quelle
1
Schön, kompakt, prägnant, eignet sich auch gut zur Erweiterung. Vielen Dank.
Norman H
1
Toll. Auch einfach zu erweitern, zu ändern, um zu löschen usw.
Drewid
Perfekt für das, was ich brauchte. Danke dir!
Jeff
2
Warum greifen die Leute immer und pfeifen dann zu awk? Awk kann Musterabgleich durchführen : awk '/^[?]/{print $2}'; Der zusätzliche Grep-Prozess ist nicht erforderlich.
Bdrx
1
@bdrx: Vielleicht, weil grep häufig mit Pattern Matching assoziiert wird? In meinem persönlichen Fall bin ich mit grep viel erfahrener als mit awk. Mir war nicht bewusst, dass Sie solche Dinge in awk tun können, deshalb werde ich awk mehr in meinen Skripten verwenden. Vielen Dank!
Lepe
5
svn add --force .

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

jmc734
quelle
5

Diese Methode sollte Dateinamen verarbeiten, 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 tut:

  • Listen Sie alle geänderten Dateien auf.
  • Beschränken Sie diese Liste auf Zeilen mit '?' am Anfang - dh neue Dateien.
  • Entferne das '?' Zeichen am Zeilenanfang.
  • Entfernen Sie die Leerzeichen am Zeilenanfang.
  • Pipe die Dateinamen in xargs, um das svn add mehrmals auszuführen.

Verwenden Sie das Argument -i für xargs, um Dateinamen mit Leerzeichen in 'svn add' importieren zu können. Grundsätzlich setzt -i {} als Platzhalter, damit wir die "Zeichen um den von 'svn verwendeten Dateinamen setzen können hinzufügen'.

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

bailey86
quelle
Dies setzt Linux oder ähnliches voraus (zB MinGW oder Cygwin ). Das OP erklärte: "Auf meinem Server wird Windows Server 2003 ausgeführt, sodass eine Unix-Lösung nicht funktioniert."
Peter Mortensen
4

TortoiseSVN verfügt über diese integrierte Funktion, 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 ...

John Meagher
quelle
Mit riesigem Repository hängt TortoiseSVN. Dies brachte mich dazu, nach Befehlszeilenalternativen zu suchen :-)
Upendra
3

Verwenden:

svn st | grep ? | cut -d? -f2 | xargs svn add
Xiè Jìléi
quelle
1
Oder Sie können Schnitt verwenden, um svn status | cut -d ? -f 2 -s | xargs svn add
Greps
Dies setzt Linux oder ähnliches voraus (zB MinGW oder Cygwin ). Das OP erklärte: "Auf meinem Server wird Windows Server 2003 ausgeführt, sodass eine Unix-Lösung nicht funktioniert."
Peter Mortensen
3

Ich benutze immer:

Kopieren Einfügen

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
Oritm
quelle
1
Op explicity besagt, dass eine Unix-Lösung für ihn keinen Nutzen hat.
Neutrino
Dies setzt Linux oder ähnliches voraus (zB MinGW oder Cygwin ). Das OP erklärte: "Auf meinem Server wird Windows Server 2003 ausgeführt, sodass eine Unix-Lösung nicht funktioniert."
Peter Mortensen
3

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 habe eine Fledermausdatei erstellt. 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 wurden, wenn ich mit dem Festschreibungsprozess beginne.

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

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

Schildkrötenhaken-Skript:

"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
quelle
2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

Innerhalb dieser Implementierung treten Probleme auf, wenn Ihre Ordner / Dateinamen mehr als ein Leerzeichen haben (siehe unten):

"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"
Olexa
quelle
2

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

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done
ajaest
quelle
Wofür ist das? CMD? Bash? Es sieht aus wie Bash (oder eine ähnliche Shell). In diesem Fall wird Linux oder ähnliches vorausgesetzt (z. B. MinGW oder Cygwin ). Das OP erklärte: "Auf meinem Server wird Windows Server 2003 ausgeführt, sodass eine Unix-Lösung nicht funktioniert."
Peter Mortensen
Danke, Sie haben Recht, wenn ich in Windows bin, verwende ich Cygwin mit Bash. Die Anweisung "Auf meinem Server wird Windows Server 2003 ausgeführt, sodass eine Unix-Lösung nicht funktioniert." ist falsch. Vielleicht möchte er Cygwin oder MinGW nicht verwenden, aber er hat sich nicht so ausgedrückt. Ich habe die Antwort neu formuliert.
ajaest
1

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

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 geht 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 weitere Details geben:

  • FOR: Sie wissen, die Regelung.
  • / F: bedeutet, die Dateien und Verzeichnisse zu nehmen (nicht genau sicher).
  • % F: es ist eine Variable; Es wird jeweils der Wert jeder der aufgelisteten Dateien angenommen. es könnte einen anderen Ein-Zeichen-Namen haben.
  • IN: Keine Notwendigkeit zu erklären, oder?
  • ('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 nehmen, / a: d bedeutet nur das Verzeichnis; Ändern Sie es nach Belieben, indem Sie die Klammern und Apostrophe beibehalten.
  • DO: bedeutet, dass als nächstes im Befehl angegeben wird, was für jedes Verzeichnis ausgeführt wird
  • svn add --depth = leer: 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 die einzigen Unterschiede der Befehl dir und der Befehl svn. Ich denke, es ist klar genug.

Heringer
quelle
0

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

Das rekursive Hinzufügen ist die Standardeigenschaft . Sie können im SVN-Buch sehen .

Das Problem kann in Ihrer Ignorierliste oder in globalen Eigenschaften liegen.

Ich habe Lösung Google Issue Tracker

Überprüfen Sie die globalen Eigenschaften, um den Stern (*) zu ignorieren.

  • Klicken Sie mit der rechten Maustaste in Ihr Repo-Fenster. Wählen Sie TortoiseSVN > Properties.
  • Überprüfen Sie, ob Sie keine Immobilie haben svn:global-ignores with a value of *
  • Wenn Sie eine Eigenschaft mit star(*)haben, wird das rekursive Hinzufügen ignoriert. Entfernen Sie also 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 Sie dort keinen Stern (*) gesetzt haben.
  • Wenn Sie gefunden haben star(*), entfernen Sie diese Eigenschaft.

Dieser Typ erklärte auch, warum diese Eigenschaft in meinem Projekt hinzugefügt wurde.

Am ähnlichsten ist es, 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 begangen hat, herausfinden, was sie tatsächlich versucht haben, und sie bitten, in Zukunft vorsichtiger zu sein. :) :)

Khemraj
quelle
0

Sie können den folgenden Befehl unter Linux eingeben:

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

Seit er Windows spezifiziert hat, wo awk & sed nicht Standard sind:

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

oder in einer Batch-Datei:

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

Dies ist die träge und gefährliche Methode, um ein Verzeichnis mit SVN einschließlich neuer Dateien zu synchronisieren:

svn rm --keep-local dir
svn add dir

Obwohl dies zur Not funktionieren kann, kann es auch schwerwiegende Folgen haben. Beispielsweise verliert SVN häufig den Überblick über den Verlauf einer Datei.

Der ideale Weg, ein Verzeichnis zu synchronisieren, besteht darin, diff zu können und dann den svn-Patch zu verwenden. Dies weicht jedoch von den Formaten im Befehl diff ab, und der Befehl svn diff vergleicht die Unterschiede im Arbeitsverzeichnis und nicht die Unterschiede auf Dateisystemebene.

jgmjgm
quelle
-1

Ich glaube, ich habe etwas Ähnliches gemacht mit:

svn add . --recursive

aber nicht sicher, ob mein Gedächtnis korrekt ist ;-p

Chakrit
quelle
2
Nur ein Update für Ihr Gedächtnis: SVN 1.4 und 1.5 unterstützen nicht - rekursiv als Parameter für SVN hinzufügen :)
Ludwig Wensauer