Ich pflege 1 Arbeitsordner und 1 Checkout-Ordner. Verschieben Sie nur Dateien aus dem Arbeitsordner in den Auscheckordner. Wenn ein Ordner hinzugefügt / entfernt werden muss, mache ich das manuell und verschiebe dann Dateien in diesen Ordner (zum Beispiel neue Pakete, alte Pakete). Die meisten SVN-Probleme treten auf, wenn Sie Ordner auf Ihrer Arbeitskopie verschieben. Selbst wenn Sie Dateien von Ihrer Arbeitskopie in eine Checkout-Kopie kopieren, sollten Sie nur Dateien verschieben, keine Ordner.
Siddharth
Antworten:
99
Wenn Sie TortoiseSVN verwenden, führen Sie einfach eine Überprüfung auf Änderungen durch , sortieren Sie nach der Spalte Status , wählen Sie alle markierten Einträge aus missing, klicken Sie mit der rechten Maustaste, um das Kontextmenü zu öffnen, und wählen Sie Löschen . Schließlich verpflichten Sie sich, die Änderungen im Repository zu veröffentlichen.
Wenn Sie unter Windows arbeiten, aber die Befehlszeile bevorzugen und gerne in PowerShell herumtollen, ist dieser Einzeiler genau das Richtige:
Filtern Sie die Ausgabe nur in die Zeilen, in denen fehlende Dateien angezeigt werden (gekennzeichnet durch ein Ausrufezeichen am Zeilenanfang), erfassen Sie den zugehörigen Dateinamen und führen Sie einen svn rmfür diesen Dateinamen aus.
Gibt es eine Möglichkeit in Eclipse mit dem Subclipse-Plugin? Es ist so schlecht, ein zu aktualisieren und sie dann im Projekt zu finden und wieder zu löschen.
Stan
Zu Ihrer Information, wenn ein Subversion-Passwort benötigt wird, lautet hier die Syntax: svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Übereinstimmungen [1] - Benutzername Benutzername_hier - Passwort Passwort_hier}
Jeff
sollten Sie zuerst nach dieser Zeile festschreiben, bevor Sie ausführen svn up? weil die Dateien vom SVN-Server wiederhergestellt werden
Pierre
Löscht diese Aktion auch die Dateien aus dem Repository?
Sebastián Ulloa
174
Wenn Sie Mac ( Darwin ) oder Linux verwenden, können Sie die Ausgaben der folgenden Befehle svn rmfür alle fehlenden Dateien an weiterleiten. Sie können das aktuelle Arbeitsverzeichnis auf das entsprechende Verzeichnis oder Unterverzeichnis festlegen, bevor Sie diese ausführen. Dies hängt davon ab, ob Sie Ihre gesamte Arbeitskopie oder nur eine Teilmenge ausführen möchten.
Führen Sie einen SVN-Status aus
Suchen Sie nach Zeilen, die mit "!" Beginnen. (fehlt)
Drucken Sie die "--force" (svn-Argument) und die zweite Spalte (den Dateinamen) der Ausgabe von # 2
Führen Sie svn rmdie Ausgabe von # 3 als Argumente aus
Dies funktioniert nicht, wenn der Dateiname Leerzeichen enthält. Ich weiß jedoch nicht genug awk, um das Problem zu beheben.
Bugloaf
2
Verwenden awk '{print " --force "$2"@"}'Sie diese Option, wenn Ihr Dateiname eine enthält @(wenn Sie beispielsweise ein iOS-Entwickler sind)
Guillaume Algis
1
Und behandeln Sie einen Dateinamen mit Leerzeichen, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'sollte den Trick tun (und beginnt hässlich auszusehen)
Guillaume Algis
12
Der vollständige Befehl, der sich um den Speicherplatz kümmert, lautet "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "substr ($ 0,2)" @ \ "}' | xargs svn rm "
HelloWorld
1
Warum steckst du das nicht --forcein den xargs-Teil?
JWG
53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
Diese Lösung funktioniert, wenn in den Dateien / Verzeichnissen Leerzeichen vorhanden sind.
Yuric
Wie fügt man dem Ausführlichkeit hinzu? xargs -verbose svn rm?
TekiusFanatikus
1
Nur ein Hinweis für Benutzer von Skripten usw., dieser Befehl schlägt fehl, wenn keine zu löschenden Dateien gefunden werden: svn: E205001: Versuchen Sie 'svn help delete', um weitere Informationen zu erhalten. Svn: E205001: Nicht genügend Argumente angegeben
Thorsten Schöning
1
Das Problem von @ ThorstenSchöning kann durch Hinzufügen -rzu den xargsOptionen behoben werden (nicht ausführen, wenn keine Argumente angegeben sind). Außerdem sollte die Anzahl der Argumente begrenzt und das Entfernen gestapelt werden, da der Aufruf mit einer sehr großen Anzahl zu entfernender Dateien fehlschlägt, z -n 500. Und last but not least ist das durchgeführte Zitat für Dateien mit Shell-Specials wie $- besser \nals Trennzeichen verwenden und das Zitieren überlassen xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Vielen Dank an Paul Martin für die Windows-Version.
Hier ist eine geringfügige Änderung des Skripts, sodass auch Windows-Dateien mit Leerzeichen berücksichtigt werden. Auch die missing.listDatei wird am Ende entfernt.
Ich habe Folgendes in svndel.bat in meinem SVN-Bin-Verzeichnis gespeichert (in meiner %% PATH-Umgebung festgelegt), damit es von jedem Ordner an der Eingabeaufforderung aufgerufen werden kann.
### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL
schön zu sehen, dass noch ein innovativer Batch-Code erscheint :)
user230910
Wow, tolle Antwort. Ich wollte gerade mit Powershell gehen, aber das war so viel einfacher.
Jim Andrakakis
Ich habe danach eine weitere Zeile hinzugefügt del missing.list 2>NUL, da ich alle neuen Dateien direkt nach dem ersten Entfernen der gelöschten Dateien hinzugefügt habe missing.list, sodass sie zu svn hinzugefügt wurden : svn delete "missing.list"funktionierte für mich
Pierre
Ich habe dieses Skript so geändert, dass versucht wird, es von einem beliebigen Speicherort aus auszuführen , und bin dann auf dieses Problem gestoßen. Stackoverflow.com/questions/1137219/…, sodass Sie anscheinend das aktuelle Arbeitsverzeichnis verwenden MÜSSEN , um diese Aktion auszuführen.
Aolszowka
7
Ich mag die PowerShell-Option ... Aber hier ist eine andere Option, wenn Sie Windows-Batch-Skripte verwenden:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
Dieses Shell-Skript untersucht rekursiv ( svn status) Verzeichnisse in Ihrem Projekt, entfernt fehlende Dateien (wie es die Frage erfordert) und fügt dem Repository neue Dateien hinzu. Es ist eine Art "Speichern des aktuellen Snapshots des Projekts im Repository".
if [ $# != 1 ]
then
echo "usage: doSVNsnapshot.sh DIR"
exit 0
fi
ROOT=$1
for i in `find ${ROOT} -type d \! -path "*.svn*" `
do
echo
echo "--------------------------"
( cd $i ;
echo $i
echo "--------------------------"
svn status | awk '
/^[!]/ { system("svn rm " $2) }
/^[?]/ { system("svn add " $2) }
'
)
echo
done
Eine geringfügige Änderung der Befehlszeile, die unter Mac OS (hoffentlich sogar unter Linux) funktioniert und mit den Dateien fertig wird, die der Befehl "svm sr" meldet, wie "! M" (fehlt und geändert).
Es kommt mit Leerzeichen in den Dateien zurecht.
Es basiert auf einer Änderung einer vorherigen Antwort:
svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm
als Referenz - dies ist DOS / cmd.exe in Windows Land
user230910
2
Beim Umgang mit vielen Dateien kann es vorkommen, dass die in xargs eingegebene Argumentation zu lang wird. Ich habe mich für eine naivere Implementierung entschieden, die auch in diesem Fall funktioniert.
Dies ist für Linux:
#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
echo $MISSING_PATH
svn rm --force "$MISSING_PATH"
done
Antworten:
Wenn Sie TortoiseSVN verwenden, führen Sie einfach eine Überprüfung auf Änderungen durch , sortieren Sie nach der Spalte Status , wählen Sie alle markierten Einträge aus
missing
, klicken Sie mit der rechten Maustaste, um das Kontextmenü zu öffnen, und wählen Sie Löschen . Schließlich verpflichten Sie sich, die Änderungen im Repository zu veröffentlichen.Wenn Sie unter Windows arbeiten, aber die Befehlszeile bevorzugen und gerne in PowerShell herumtollen, ist dieser Einzeiler genau das Richtige:
Filtern Sie die Ausgabe nur in die Zeilen, in denen fehlende Dateien angezeigt werden (gekennzeichnet durch ein Ausrufezeichen am Zeilenanfang), erfassen Sie den zugehörigen Dateinamen und führen Sie einen
svn rm
für diesen Dateinamen aus.(Blogpost Das Entfernen aller "fehlenden" Dateien aus einer SVN-Arbeitskopie bewirkt etwas Ähnliches für Unix / Linux.)
quelle
svn up
? weil die Dateien vom SVN-Server wiederhergestellt werdenWenn Sie Mac ( Darwin ) oder Linux verwenden, können Sie die Ausgaben der folgenden Befehle
svn rm
für alle fehlenden Dateien an weiterleiten. Sie können das aktuelle Arbeitsverzeichnis auf das entsprechende Verzeichnis oder Unterverzeichnis festlegen, bevor Sie diese ausführen. Dies hängt davon ab, ob Sie Ihre gesamte Arbeitskopie oder nur eine Teilmenge ausführen möchten.svn rm
die Ausgabe von # 3 als Argumente ausDer vollständige Befehl lautet also:
Verweise:
quelle
awk '{print " --force "$2"@"}'
Sie diese Option, wenn Ihr Dateiname eine enthält@
(wenn Sie beispielsweise ein iOS-Entwickler sind)awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
sollte den Trick tun (und beginnt hässlich auszusehen)--force
in den xargs-Teil?svn status
svn remove
jede Dateiquelle
-r
zu denxargs
Optionen behoben werden (nicht ausführen, wenn keine Argumente angegeben sind). Außerdem sollte die Anzahl der Argumente begrenzt und das Entfernen gestapelt werden, da der Aufruf mit einer sehr großen Anzahl zu entfernender Dateien fehlschlägt, z-n 500
. Und last but not least ist das durchgeführte Zitat für Dateien mit Shell-Specials wie$
- besser\n
als Trennzeichen verwenden und das Zitieren überlassenxargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Ich habe gerade Folgendes gefunden, das den Trick macht: Entfernen Sie alle "fehlenden" Dateien aus einer SVN-Arbeitskopie :
quelle
Vielen Dank an Paul Martin für die Windows-Version.
Hier ist eine geringfügige Änderung des Skripts, sodass auch Windows-Dateien mit Leerzeichen berücksichtigt werden. Auch die
missing.list
Datei wird am Ende entfernt.Ich habe Folgendes in svndel.bat in meinem SVN-Bin-Verzeichnis gespeichert (in meiner %% PATH-Umgebung festgelegt), damit es von jedem Ordner an der Eingabeaufforderung aufgerufen werden kann.
quelle
del missing.list 2>NUL
, da ich alle neuen Dateien direkt nach dem ersten Entfernen der gelöschten Dateien hinzugefügt habemissing.list
, sodass sie zu svn hinzugefügt wurden :svn delete "missing.list"
funktionierte für michIch mag die PowerShell-Option ... Aber hier ist eine andere Option, wenn Sie Windows-Batch-Skripte verwenden:
quelle
Eine Alternative, die unter Linux (Bash) für zu entfernende Dateien funktioniert, die keine Leerzeichen im Pfad enthalten:
quelle
Dieses Shell-Skript untersucht rekursiv (
svn status
) Verzeichnisse in Ihrem Projekt, entfernt fehlende Dateien (wie es die Frage erfordert) und fügt dem Repository neue Dateien hinzu. Es ist eine Art "Speichern des aktuellen Snapshots des Projekts im Repository".quelle
Eine geringfügige Änderung der Befehlszeile, die unter Mac OS (hoffentlich sogar unter Linux) funktioniert und mit den Dateien fertig wird, die der Befehl "svm sr" meldet, wie "! M" (fehlt und geändert).
Es kommt mit Leerzeichen in den Dateien zurecht.
Es basiert auf einer Änderung einer vorherigen Antwort:
quelle
Es ist tatsächlich möglich, die
missing.list
von user3689460 und Paul Martin vollständig zu entfernenquelle
Beim Umgang mit vielen Dateien kann es vorkommen, dass die in xargs eingegebene Argumentation zu lang wird. Ich habe mich für eine naivere Implementierung entschieden, die auch in diesem Fall funktioniert.
Dies ist für Linux:
quelle
Verbesserte Version
Der vollständige Befehl lautet also:
quelle