2011-01-05 35 views
44

Ich habe ein Skript, in dem ich alle neuen Dateien hinzufügen, bevor meine Arbeitskopie auf mein Repository mit dieser Linie verpflichten:Wie lösche ich alle gelöschten Dateien aus dem Repository?

svn status | grep ^\? | awk '{print $2}' | xargs svn add 

Ich möchte jetzt eine Zeile hinzufügen, die aus dem Repository alle gelöschten Dateien in meinem Arbeits löschen Kopieren. Mit anderen Worten, ich kann sie nicht einzeln angeben, und ich muss sie mit Svn-Status erkennen und sie dann automatisch entfernen. Die Linie funktioniert jedoch nicht.

svn status | grep ^\! | awk '{print $2}' | xargs svn --force delete 

Wie Sie sehen, ich habe

ersetzt

"?" mit "!" und

"add" mit "--force delete"

Können Sie mir sagen, warum es doesn‘ t arbeiten?

ps. Ich weiß, dass es ein riskantes Verfahren ist. Ich habe schon alles darüber diskutiert. dank

dank

+0

Haben Sie es versucht? Warum nicht selbst, anstatt auf eine Antwort zu warten? – viraptor

+0

@viraptor Ich habe gerade versucht, es funktioniert nicht – aneuryzm

+0

Das Problem ist, Sie versuchen, Dateien zu entfernen, die mit einem Ausrufezeichen markiert sind, was bedeutet, dass etwas nicht stimmt. Das heißt, Sie haben diese Datei mit dem Betriebssystembefehl gelöscht, anstelle von svn löschen, was SVN nicht mag ...... Das Problem, das ich nicht verstehe ... Wie haben Sie das Löschen der Dateien gemacht, die Sie jetzt wollen durch svn rm --force dauerhaft machen? – khmarbaise

Antwort

59

ich das gerade versucht, und es funktioniert perfekt.

$ svn st | grep '^!' | awk '{print $2}' | xargs svn delete --force 
D   groups.pl 
D   textblock.pl 

Haben Ihre Dateien Leerzeichen in ihren Namen?

WARTEN SIE EINE ZWEITE !! Ich sehe das Problem. Sie haben:

svn --force delete 

und nicht:

svn delete --force 

Die --force ist ein Parameter des delete Befehls und nicht der svn Befehl.

+0

Ich habe eine Frage dazu. Wenn ich eine Datei lösche, verliere ich alle vorherigen Versionen? Mit anderen Worten, ich kann es nicht mehr richtig machen? Also werden alle früheren Verpflichtungen ebenfalls gelöscht? – aneuryzm

+0

Es funktioniert immer noch nicht ... aber ich denke an diesem Punkt, ein Tool wie rsync zu verwenden, um Sicherungen meiner Dateien zu machen (dieser Kommentar kommt nicht in Frage, aber ich erkannte, dass ich Svn nicht so verwenden kann) – aneuryzm

+1

Ja, Sie können eine Datei abrufen, die gelöscht wurde. Sie müssen die Revision des Verzeichnisses mit der gelöschten Datei finden und das Revisions-Pinning verwenden ("@" am Ende der URL). Von dort können Sie die fehlende Datei in die aktuelle Revision kopieren. Sie können auch eine umgekehrte Zusammenführung durchführen, um alle Ihre Änderungen rückgängig zu machen. In der Tat, eine der Beschwerden über SVN ist, dass Sie eine Datei nicht vollständig löschen (unkenntlich machen) können, falls Sie eine Datei, die Sie nicht benötigen (wie Ihr Passwort), übertragen haben. –

2

was über das Hinzufügen Sie einfach

svn add --force . 

oder

svn --force add . 

es tun würde, die gleiche verwenden: fügen Sie alle unversionierte Dateien außer denen passende svn: Ignoriermuster

+0

Das Skript des OPs arbeitet rekursiv - diese Methode funktioniert nicht. – Mortoc

+3

warum? Ich habe es überprüft, es funktioniert rekursiv – sdespolit

2

Ansatz einen Perl-Einzeiler verwenden wäre:

svn st | perl -ne 'print "$1\n" if /^\!\s+(.*)/' | xargs svn rm 

dies auch mit Leerzeichen in Dateinamen funktionieren soll.

edit: verbesserte regexp

5
svn status | grep '^!' | sed 's/! *//' | xargs -d '\n' svn delete --force 

Die Lösung für Dateinamen mit Leer- und Sonderzeichen funktioniert.

  • svn status - listet alle Änderungen, gelöschte Dateien markiert sind, als !
  • grep '^!' - extrahiert Zeilen, die mit ! beginnt (dh Dateien gelöscht)
  • sed 's/! *//' - entfernt ! -char am Anfang und Räume, nachdem es
  • xargs -d '\n' - behandelt jede Eingabezeile (einschließlich Leerzeichen und Sonderzeichen) als separates Argument und übergibt sie an svn delete --force
+0

FYI die '-d' Option von' xargs' wird unter OS X nicht unterstützt - scheint also nur unter Linux zu funktionieren (oder fehlt mir etwas?) – HughHughTeotl

+0

Upvoted für das '-d' \ n'' Möglichkeit! – Mitchapp

Verwandte Themen