Linux i SVN: Jak usunąć wszystkie wersjonowane pliki oprócz struktury katalogów KEEP, zignorować katalogi .svn?

9

Chcę usunąć wszystkie wersjonowane pliki z mojego repozytorium, ale ZACHOWAJ strukturę wersjonowanego katalogu. Oczywiście chcę pozostawić wszystkie katalogi .svn nietknięte.

Innymi słowy, chcę całkowicie opróżnić strukturę katalogów kopii roboczej BEZ uszkodzenia samej struktury katalogów.

Na przykład usunięcie plików z tej struktury:

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

Powinien skutkować:

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

Szukam jakiegoś findpolecenia lub czegoś, aby to osiągnąć i mam problem z budowaniem polecenia. Dzięki za pomoc!

Brian Lacy
źródło
Powodem tego jest to, że mam aplikację internetową, która została opracowana w „wersjach”, ale nigdy wcześniej nie była pod kontrolą wersji. Chcę poddać go teraz kontroli wersji SVN, a dla ułatwienia wyszukiwania informacji historycznych itp. Próbuję replikować postęp czterech wersji z czterech różnych folderów „kopii zapasowych” zawierających stopniowo starsze wersje. Po usunięciu plików mogę skopiować nowsze pliki do hierarchii, aby zasymulować nowszą wersję. Nie jestem pewien, czy to wszystko ma sens. :)
Brian Lacy
1
Warto zauważyć, że SVN od wersji 1.7 (październik 2011) nie ma już wielu katalogów „.svn”, ale tylko jeden katalog .svn na najwyższym poziomie. Zobacz subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Odpowiedzi:

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

powinien pasować do rachunku (głównie pochodzi ze strony wyszukiwania dla -path). Zrób to mniej i sprawdź. Najpierw znajduje (ścieżka kończy się na .svn i nie powraca do (przycinania) tego katalogu) lub (jeśli jest to plik, wydrukuj go).

Jeśli wygląda dobrze, zmień na

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

Wersja + łączy wszystkie pliki w jedno polecenie rm. Jeśli jesteś paranoikiem, najpierw wykonaj kopię zapasową drzewa ( cp -a dir/ otherdir/).

DerfK
źródło
Idealne rozwiązanie, właśnie tego potrzebowałem! Dzięki Derf!
Brian Lacy,
Zamiast „-exec rm {} +” możesz również użyć bardziej intuicyjnej opcji „-delete”.
Tim Bielawa,
1
@Tim Według strony man znajdź, -deletegłębokość jest pierwsza i dlatego jest w konflikcie, -pruneponieważ pliki w folderze zostaną sprawdzone przed zbadaniem samego folderu. Inne rozwiązanie ( -not -path ...zamiast opcji -path ... -prunemożna użyć opcji -delete.
DerfK
Dobry chwyt!
Tim Bielawa,
Przez lata używałem tej sztuczki (lub podobnej) wiele razy w różnych scenariuszach. Jeszcze raz dziękuję, @DerfK. :)
Brian Lacy
2
odnaleźć . -not -path "* /. svn / *" -and -type f -and -exec / bin / rm '{}' \;

Powinien zrobić lewę.

znak
źródło
Tylko wskazówka, ale zamiast -exec /bin/rm '{}'ciebie możesz użyć -delete.
Aaron Copley,