Gibt es in SVN einen Befehl, mit dem ich alle lokal fehlenden Dateien in einem Verzeichnis löschen kann?
Andernfalls können Sie nur die fehlenden Dateien auflisten (oder im allgemeineren Fall den Status A, D usw. haben).
Gibt es in SVN einen Befehl, mit dem ich alle lokal fehlenden Dateien in einem Verzeichnis löschen kann?
Andernfalls können Sie nur die fehlenden Dateien auflisten (oder im allgemeineren Fall den Status A, D usw. haben).
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:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
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.)
svn up
? weil die Dateien vom SVN-Server wiederhergestellt werden
Wenn 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:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Verweise:
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 st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
jede Datei-r
zu den xargs
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 überlassen xargs
: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 :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
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.
### 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
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
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
Es ist tatsächlich möglich, die missing.list
von user3689460 und Paul Martin vollständig zu entfernen
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
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