Linux y SVN: ¿Cómo eliminar todos los archivos versionados pero MANTENER la estructura de directorios, ignorar los directorios .svn?


9

Quiero eliminar todos los archivos versionados de mi repositorio, pero MANTENGO la estructura de directorios versionada. Obviamente quiero dejar todos los directorios .svn intactos.

En otras palabras, quiero vaciar completamente la estructura de directorios de una copia de trabajo SIN dañar la estructura de directorios en sí.

Por ejemplo, eliminando los archivos de esta estructura:

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

Debería resultar en:

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

Estoy buscando algún tipo de findcomando o algo para lograr esto, y tengo problemas para construir el comando. ¡Gracias por la ayuda!


La razón por la que hago esto es porque tengo una aplicación web que se ha desarrollado en "versiones" pero que nunca antes había estado bajo control de revisión. Quiero ponerlo bajo control de revisión SVN ahora, y para facilitar la referencia histórica, etc., estoy tratando de replicar una progresión de cuatro versiones de cuatro carpetas "de respaldo" diferentes que contienen versiones progresivamente más antiguas. Una vez que se eliminan los archivos, puedo copiar los archivos más nuevos en la jerarquía para simular la revisión más reciente. No estoy seguro si todo eso tiene sentido. :)
Brian Lacy

1
Vale la pena señalar que SVN desde la versión 1.7 (octubre de 2011) ya no tiene múltiples directorios ".svn", sino solo un directorio .svn en el nivel superior. Ver subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rico el

Respuestas:


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

debe ajustarse a la factura (principalmente proviene de la página de manual de búsqueda -path). Conéctelo a menos y compruébelo. Lo que hace primero es encontrar (la ruta termina en .svn y no se repite en (podar) este directorio) o (si es un archivo, imprímalo).

Si se ve bien, cámbielo a

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

La versión + une todos los archivos en un solo comando rm. Si eres paranoico, cp -a dir/ otherdir/primero mantén una copia de seguridad del árbol ( ).


Solución perfecta, ¡eso es exactamente lo que necesitaba! Gracias Derf!
Brian Lacy

En lugar de '-exec rm {} +' también puede usar la opción más intuitiva '-delete'.
Tim Bielawa

1
@Tim De acuerdo con la página de manual de find, -deletees profundo primero y por lo tanto entra en conflicto -pruneporque los archivos dentro de la carpeta se verificarían antes de examinar la carpeta en sí. La otra solución (usar en -not -path ...lugar de -path ... -pruneusar la opción -delete.)
DerfK

¡Buena atrapada!
Tim Bielawa

He usado este truco (o similar) varias veces a lo largo de los años en una variedad de escenarios. Así que gracias de nuevo, @DerfK. :)
Brian Lacy el

2
encontrar . -not -path "* /. svn / *" -y -type f -and -exec / bin / rm '{}' \;

Debo hacer el truco.


Solo un consejo, pero en lugar de -exec /bin/rm '{}'usted puede usar -delete.
Aaron Copley
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.