117 Stimmen

Automatisches Entfernen nicht versionierter Subversion-Dateien

Kennt jemand eine Möglichkeit, alle Dateien in einer Arbeitskopie, die nicht unter Versionskontrolle stehen, rekursiv zu entfernen? (Ich brauche dies, um zuverlässigere Ergebnisse in meinem automatischen VMware-Build zu erhalten).

7 Stimmen

Ich bin ein SVN-Benutzer und habe Git mit SVN verglichen, um herauszufinden, ob ich eventuell umsteigen möchte. Es sieht so aus, als ob dies ein weiteres Beispiel ist, bei dem Git mit seinem Befehl "git clean" glänzt.

3 Stimmen

Oder hg purge --all in Mercurial.

0 Stimmen

Duplikat von stackoverflow.com/questions/2803823/ wo es viel mehr nützliche Aktivitäten gibt.

4voto

rob bentley Punkte 133

Wenn Sie tortoise svn verwenden, gibt es einen versteckten Befehl, um dies zu tun. Halten Sie die Umschalttaste gedrückt, während Sie mit der rechten Maustaste auf einen Ordner klicken, um das Kontextmenü im Windows-Explorer zu öffnen. Sie erhalten dann den Befehl "Nicht versionierte Objekte löschen".

siehe unten auf dieser Seite Seite für Details, oder das Bildschirmfoto unten, das die erweiterten Merkmale mit den grünen Sternen und das interessante mit dem gelben Rechteck hervorhebt...

SVN Extended context menu vs standard menu

4voto

stevek_mcc Punkte 340

Wenn Sie eine TortoiseSVN auf Ihrem Pfad und Sie befinden sich im richtigen Verzeichnis:

TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui

Die Optionen werden in der TortoiseSVN Hilfe beschrieben für /command:cleanup :

Verwenden Sie /noui, um zu verhindern, dass der Ergebnisdialog angezeigt wird entweder über den Abschluss der Bereinigung oder eine Fehlermeldung Meldung). Mit /noprogressui wird auch der Fortschrittsdialog abgeschaltet. /nodlg deaktiviert die Anzeige des Bereinigungsdialogs, in dem der Benutzer auswählen kann, was was genau bei der Bereinigung gemacht werden soll. Die verfügbaren Aktionen können mit den Optionen /cleanup für die Statusbereinigung, /revert, /delunversioned, /delignored, /refreshshell und /externals.

3voto

Stefan Schultze Punkte 8850

Meine C#-Konvertierung von Thomas Watnedals Python-Skript:

Console.WriteLine("SVN cleaning directory {0}", directory);

Directory.SetCurrentDirectory(directory);

var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.WorkingDirectory = directory;

using (var process = Process.Start(psi))
{
    string line = process.StandardOutput.ReadLine();
    while (line != null)
    {
        if (line.Length > 7)
        {
            if (line[0] == '?')
            {
                string relativePath = line.Substring(7);
                Console.WriteLine(relativePath);

                string path = Path.Combine(directory, relativePath);
                if (Directory.Exists(path))
                {
                    Directory.Delete(path, true);
                }
                else if (File.Exists(path))
                {
                    File.Delete(path);
                }
            }
        }
        line = process.StandardOutput.ReadLine();
    }
}

0 Stimmen

Ich würde lieber die nicht versionierten Dateien verschieben, nur für den Fall, dass Sie sie später irgendwo brauchen.

0 Stimmen

Auf einer Entwicklungsmaschine natürlich - aber in der Build-VMware würde das keinen Sinn machen, weil sich dort niemand anmeldet und Dateien erstellt.

0 Stimmen

Danke, ich habe dies als Teil meines MSBuild-Skripts in cruisecontrol verwendet, um mein Quellverzeichnis vor den Builds zu bereinigen

3voto

maxschlepzig Punkte 31061
svn st --no-ignore  | grep '^[?I]' | sed 's/^[?I]  *//' | xargs -r -d '\n' rm -r

Dies ist ein Unix-Shell-Befehl zum Löschen aller Dateien, die nicht unter der Kontrolle von Subversion stehen.

Anmerkungen:

  • die st en svn st ist ein eingebauter Alias für status , d.h. der Befehl ist äquivalent zu svn status
  • --no-ignore bezieht auch Nicht-Repository-Dateien in die Statusausgabe ein, ignoriert sie aber ansonsten über Mechanismen wie .cvsignore usw. - Da das Ziel darin besteht, eine saubere Ausgangsbasis für Builds zu haben, ist dieser Schalter ein Muss
  • die grep filtert die Ausgabe so, dass nur Dateien, die Subversion unbekannt sind, übrig bleiben - die Zeilen, die mit ? Dateien auflisten, die Subversion unbekannt sind und die ohne die Option --no-ignore Option
  • wird das Präfix bis zum Dateinamen über sed
  • die xargs Kommando wird angewiesen über -r nicht auszuführen rm wenn die Argumentliste leer wäre
  • die -d '\n' Option sagt xargs um einen Zeilenumbruch als Trennzeichen zu verwenden, so dass der Befehl auch für Dateinamen mit Leerzeichen funktioniert
  • rm -r wird verwendet, wenn komplette Verzeichnisse (die nicht Teil des Repositorys sind) entfernt werden müssen

2voto

Aria Punkte 1760
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'

Entfernen Sie das Echo, wenn Sie das wirklich wollen.

1 Stimmen

Dies ist schlechter als die auf xargs basierenden Antworten, denn für n zu löschende Dateien gibt es n /bin/sh und n rm Prozesse verzweigt.

0 Stimmen

Einverstanden. Danke für die xargs-Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X