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.
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'
Dies ist eine andere Frage zu meiner , aber es gibt eine Antwort auf diese Frage:
svn status | grep '?' | sed 's/^.* /svn add /' | bash
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.
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}'`
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:
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.
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 ...
Ich verwende immer:
Kopieren Einfügen
svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
svn add --force .
Dadurch werden alle nicht versionierten Dateien im aktuellen Verzeichnis und allen versionierten untergeordneten Verzeichnissen hinzugefügt.
Dies ist, wie in svn book dokumentiert, das einfachste und funktioniert perfekt für mich
svn add * --force
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
Benutzen:
svn st | grep ? | cut -d? -f2 | xargs svn add
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
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"
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:
Im zweiten Befehl sind der einzige Unterschied der Befehl dir und der Befehl svn. Ich denke, es ist klar genug.
Sie können den folgenden Befehl unter Linux eingeben:
find ./ -name "*." | xargs svn add
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"
Sie können den Befehl verwenden
svn add * force--
oder
svn add <directory/file name>
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
TortoiseSVN > Properties
.svn:global-ignores with a value of *
star(*)
verfügen, wird das rekursive Hinzufügen ignoriert. Also entfernen Sie diese Eigenschaft.TortoiseSVN > Settings > General
.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. :)