Linux & SVN: Comment supprimer tous les fichiers versionnés mais garder la structure du répertoire, ignorer les répertoires .svn?

9

Je souhaite supprimer tous les fichiers versionnés de mon référentiel, mais CONSERVER la structure de répertoires versionnée. Évidemment, je veux laisser tous les répertoires .svn intacts.

En d'autres termes, je veux vider complètement la structure de répertoire d'une copie de travail SANS nuire à la structure de répertoire elle-même.

Par exemple, supprimer les fichiers de cette structure:

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

Devrait se traduire par:

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

Je cherche une sorte de findcommande ou quelque chose pour accomplir cela, et j'ai du mal à construire la commande. Merci pour l'aide!

Brian Lacy
la source
La raison pour laquelle je fais cela est que j'ai une application web qui a été développée en "versions" mais n'a jamais été sous contrôle de révision auparavant. Je veux le mettre sous contrôle de révision SVN maintenant, et pour faciliter la référence historique, etc., j'essaie de reproduire une progression de quatre versions à partir de quatre dossiers de "sauvegarde" différents contenant des versions progressivement plus anciennes. Une fois les fichiers supprimés, je peux copier les fichiers les plus récents dans la hiérarchie pour simuler la révision la plus récente. Je ne sais pas si tout cela a du sens. :)
Brian Lacy
1
Il convient de noter que depuis la version 1.7 (octobre 2011), SVN n'a plus plusieurs répertoires ".svn", mais un seul répertoire .svn au niveau supérieur. Voir subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Réponses:

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

devrait correspondre à la facture (provient principalement de la page de manuel find pour -path). Tuyau à moins et vérifiez-le. Ce qu'il fait est d'abord trouver (le chemin se termine par .svn et ne pas récursivement dans (élaguer) ce répertoire) ou (si c'est un fichier, l'imprimer).

S'il semble bon, changez-le en

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

La version + colle tous les fichiers ensemble dans une seule commande rm. Si vous êtes paranoïaque, gardez d'abord une sauvegarde de l'arborescence ( cp -a dir/ otherdir/).

DerfK
la source
Solution parfaite, c'est exactement ce dont j'avais besoin! Merci Derf!
Brian Lacy
Au lieu de «-exec rm {} +», vous pouvez également utiliser l'option «-delete» plus intuitive.
Tim Bielawa du
1
@Tim Selon la page de manuel find, la priorité est donnée à la -deleteprofondeur et donc en conflit avec -prunecar les fichiers à l'intérieur du dossier seront vérifiés avant que le dossier lui-même ne soit examiné. L'autre solution (en utilisant -not -path ...plutôt que -path ... -prunepeut utiliser l'option -delete.
DerfK
Belle prise!
Tim Bielawa du
J'ai utilisé cette astuce (ou similaire) de nombreuses fois au fil des ans dans divers scénarios. Merci encore, @DerfK. :)
Brian Lacy
2
trouver . -not -path "* /. svn / *" -and -type f -and -exec / bin / rm '{}' \;

Doit faire l'affaire.

marque
la source
Juste une astuce, mais au lieu de -exec /bin/rm '{}'vous pouvez utiliser -delete.
Aaron Copley