Linux & SVN: Wie entferne ich alle versionierten Dateien außer der KEEP-Verzeichnisstruktur und ignoriere .svn-Verzeichnisse?

9

Ich möchte alle versionierten Dateien aus meinem Repository entfernen, aber die versionierte Verzeichnisstruktur beibehalten. Natürlich möchte ich alle .svn-Verzeichnisse unberührt lassen.

Mit anderen Worten, ich möchte die Verzeichnisstruktur einer Arbeitskopie vollständig leeren, ohne die Verzeichnisstruktur selbst zu beschädigen.

Entfernen der Dateien aus dieser Struktur:

dir/
    .svn/
        [files]
    svsubdir1/
        file1
        .svn/
            [files]
    subdir2/
        file2
        file3
        file4
        .svn/
            [files]
        subsubdir1/
            file5
            .svn/
                [files]

Sollte führen zu:

dir/
    .svn/
        [files]
    svsubdir1/
        .svn/
            [files]
    subdir2/
        .svn/
            [files]
        subsubdir1/
            .svn/
                [files]

Ich suche nach einem findBefehl oder etwas, um dies zu erreichen, und ich habe Probleme beim Erstellen des Befehls. Danke für die Hilfe!

Brian Lacy
quelle
Der Grund dafür ist, dass ich eine Web-App habe, die in "Versionen" entwickelt wurde, aber noch nie unter Revisionskontrolle stand. Ich möchte es jetzt unter die SVN-Revisionskontrolle stellen. Um die historische Referenz zu vereinfachen, versuche ich, eine Folge von vier Versionen aus vier verschiedenen "Sicherungs" -Ordnern zu replizieren, die zunehmend ältere Versionen enthalten. Sobald die Dateien gelöscht sind, kann ich die neueren Dateien in die Hierarchie kopieren, um die neuere Revision zu simulieren. Ich bin mir nicht sicher, ob das alles Sinn macht. :)
Brian Lacy
1
Es ist erwähnenswert, dass SVN seit Version 1.7 (Oktober 2011) nicht mehr mehrere ".svn" -Verzeichnisse hat, sondern nur noch ein .svn-Verzeichnis auf der obersten Ebene. Siehe subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Antworten:

10
find dir/ -path '*/.svn' -prune -o -type f -print

sollte die Rechnung passen (kommt meistens von der Find Manpage für -path). Pfeife es auf weniger und schau es dir an. Zuerst wird gesucht (Pfad endet in .svn und nicht in dieses Verzeichnis zurückgreifen (bereinigen)) oder (wenn es sich um eine Datei handelt, drucken Sie sie aus).

Wenn es gut aussieht, ändern Sie es in

find dir/ -path '*/.svn' -prune -o -type f -exec rm {} +

Die + -Version fügt alle Dateien in einem rm-Befehl zusammen. Wenn Sie paranoid sind, sichern Sie zuerst den Baum ( cp -a dir/ otherdir/).

DerfK
quelle
Perfekte Lösung, genau das habe ich gebraucht! Danke Derf!
Brian Lacy
Anstelle von '-exec rm {} +' können Sie auch die intuitivere Option '-delete' verwenden.
Tim Bielawa
1
@Tim Laut der Find-Manpage -deletesteht die Tiefe an erster Stelle und steht daher in Konflikt, -pruneda die Dateien im Ordner überprüft werden, bevor der Ordner selbst untersucht wird. Die andere Lösung (mit -not -path ...anstatt -path ... -prunedie Option -delete verwenden zu können.
DerfK
Schöner Fang!
Tim Bielawa
Ich habe diesen Trick (oder ähnliches) im Laufe der Jahre mehrfach in verschiedenen Szenarien angewendet. Nochmals vielen Dank, @DerfK. :)
Brian Lacy
2
finden . -not -path "* /. svn / *" -und -typ f -und -exec / bin / rm '{}' \;

Sollte den Trick machen.

Kennzeichen
quelle
Nur ein Tipp, aber stattdessen -exec /bin/rm '{}'können Sie verwenden -delete.
Aaron Copley