SVN-Befehl zum Löschen aller lokal fehlenden Dateien


133

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


1
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:

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 rmfür diesen Dateinamen aus.

(Blogpost Das Entfernen aller "fehlenden" Dateien aus einer SVN-Arbeitskopie bewirkt etwas Ähnliches für Unix / Linux.)


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.

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

Der vollständige Befehl lautet also:

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

Verweise:


4
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
  1. svn status
  2. Filtern Sie nur nach fehlenden Dateien
  3. Ausrufezeichen ausschneiden
  4. Filtern Sie nachgestellte Leerzeichen heraus
  5. Führendes Zitat hinzufügen
  6. Fügen Sie ein nachfolgendes Zitat hinzu
  7. svn remove jede Datei

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
haui


19

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)

5

Eine Alternative, die unter Linux (Bash) für zu entfernende Dateien funktioniert, die keine Leerzeichen im Pfad enthalten:

svn delete `svn status | grep! | awk '{print $ 2}' `

4

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

4

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

4

Es ist tatsächlich möglich, die missing.listvon user3689460 und Paul Martin vollständig zu entfernen

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

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

1

Verbesserte Version

Der vollständige Befehl lautet also:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.