it-swarm.com.de

SVN-Befehl zum Löschen aller lokal fehlenden Dateien

Gibt es in SVN einen Befehl, mit dem alle lokal fehlenden Dateien in einem Verzeichnis gelöscht werden können?

Andernfalls können Sie nur die fehlenden Dateien auflisten (oder im allgemeinen Fall den Status A, D,? Usw.).

120
wheresrhys

Wenn Sie TortoiseSVN verwenden, führen Sie einfach ein Check for Modifications aus, sortieren Sie nach der Spalte Status, wählen Sie alle mit missing markierten Einträge aus, öffnen Sie das Kontextmenü mit der rechten Maustaste, und wählen Sie Delete. . Schließlich verpflichten Sie sich, die Änderungen im Repository zu veröffentlichen.

Wenn Sie Windows verwenden, aber die Befehlszeile vorziehen und in PowerShell gerne herumtollen, wird dieser One-Liner den Trick ausführen:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

Filtern Sie die Ausgabe also nur in die Zeilen, die fehlende Dateien enthalten (gekennzeichnet durch ein Ausrufezeichen am Zeilenanfang), erfassen Sie den zugehörigen Dateinamen und führen Sie einen svn rm für diesen Dateinamen aus.

(Blogbeitrag Entferne alle "fehlenden" Dateien aus einer SVN-Arbeitskopie macht etwas Ähnliches für Unix/Linux.)

88
Michael Sorens

Wenn Sie Mac ( Darwin ) oder Linux verwenden, können Sie die Ausgaben der folgenden Befehle für alle fehlenden Dateien an svn rm übergeben. Sie können das aktuelle Arbeitsverzeichnis vor der Ausführung auf das entsprechende Verzeichnis oder das entsprechende Unterverzeichnis setzen. Dies hängt davon ab, ob Sie Ihre gesamte Arbeitskopie oder nur eine Teilmenge ausführen möchten.

  1. Führen Sie einen SVN-Status aus
  2. Suche nach Zeilen, die mit "!" Beginnen (fehlt)
  3. Drucken Sie "--force" (Argument svn) und die zweite Spalte (Dateiname) der Ausgabe von # 2 aus
  4. Führen Sie svn rm mit der Ausgabe von # 3 als Argumente aus

Der vollständige Befehl lautet also:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

Verweise:

158
Peter Ajtai
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Filtern Sie nur nach fehlenden Dateien
  3. Ausrufezeichen ausschneiden
  4. Nachlaufende Leerzeichen herausfiltern
  5. Führendes Zitat hinzufügen
  6. Nachlaufendes Zitat hinzufügen
  7. svn remove jede Datei
47
ivrin

Ich habe gerade das gefunden, was den Trick bewirkt, Alle "fehlenden" Dateien von einer SVN-Arbeitskopie entfernen :

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
27
wheresrhys

Danke an Paul Martin für die Windows-Version.

Hier ist eine geringfügige Änderung des Skripts, so dass 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 (in meiner %% PATH-Umgebung festgelegt) gespeichert, damit es aus 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
15
user3689460

Ich mag die PowerShell-Option ... Wenn Sie jedoch Windows-Batch-Skripts verwenden, finden Sie hier eine weitere Option:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
6
Paul Martin

Eine Alternative, die unter Linux (bash) für zu entfernende Dateien ohne Leerzeichen in path funktioniert

svn löschen `svn status | grep! | awk '{print $ 2}' `
4
gilyen

Dieses Shell-Skript untersucht rekursiv (svn status) Verzeichnisse in Ihrem Projekt und entfernt fehlende Dateien (je nach Frage) und fügt neue Dateien zum Repository hinzu. Es ist eine Art "Speichern der aktuellen Momentaufnahme des Projekts in das 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
3
cibercitizen1

Eine geringfügige Modifikation der Kommandozeile, die unter Mac OS (hoffentlich auch unter Linux) funktioniert und den Dateien den Befehl "svm sr" wie "! M" (fehlt und modifiziert) meldet.

Es verarbeitet Leerzeichen in den Dateien.

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
3
Stefano Bossi

Bei vielen Dateien kann es vorkommen, dass die Argumenteingabe in xargs 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
2
Jonas Eberle

Es ist tatsächlich möglich, den missing.list vollständig von user3689460 und Paul Martin zu entfernen

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
2
Amfasis

Verbesserte Version

Der vollständige Befehl lautet also:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
0
Zeta