Linux & SVN: Как удалить все версионные файлы, кроме структуры директории KEEP, игнорировать .svn dirs?

9

Я хочу удалить все версионные файлы из моего репозитория, но СОХРАНИТЕ версионную структуру каталогов. Очевидно, я хочу оставить все каталоги .svn нетронутыми.

Другими словами, я хочу полностью очистить структуру каталогов рабочей копии БЕЗ вреда для самой структуры каталогов.

Например, удаление файлов из этой структуры:

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

Должно привести к:

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

Я ищу какую-то findкоманду или что-то для этого, и у меня возникают проблемы при создании команды. Спасибо за помощь!

Брайан Лейси
источник
Я делаю это потому, что у меня есть веб-приложение, которое было разработано в «версиях», но никогда ранее не контролировалось. Я хочу поставить его под контроль версий SVN сейчас, и для простоты исторической справки и т. Д. Я пытаюсь воспроизвести последовательность четырех версий из четырех разных «резервных» папок, содержащих прогрессивно более старые версии. После удаления файлов я могу скопировать новые файлы в иерархию, чтобы имитировать более новую ревизию. Не уверен, что все это имеет смысл. :)
Брайан Лейси
1
Стоит отметить, что SVN начиная с версии 1.7 (октябрь 2011 г.) больше не имеет нескольких каталогов ".svn", а только один .svn dir на верхнем уровне. См. Subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Ответы:

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

должен отвечать всем требованиям (в основном это страница справки по поиску -path). Трубите это меньше и проверьте это. Сначала он находит (путь заканчивается в .svn и не возвращается в этот каталог), либо (если это файл, распечатайте его).

Если это выглядит хорошо, измените его на

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

+ Версия объединяет все файлы в одну команду rm. Если вы параноик, сначала сохраните резервную копию дерева ( cp -a dir/ otherdir/).

DerfK
источник
Идеальное решение, это именно то, что мне нужно! Спасибо, Дерф!
Брайан Лейси
Вместо '-exec rm {} +' вы также можете использовать более интуитивную опцию '-delete'.
Тим Белава
1
@Tim В соответствии с man-страницей find, он -deleteимеет глубину и поэтому конфликтует с -pruneтем, что файлы внутри папки будут проверяться перед проверкой самой папки. Другое решение (использование, -not -path ...а не -path ... -pruneможет использовать опцию -delete.
DerfK
Хорошо поймал!
Тим Белава
Я использовал этот трюк (или подобный) много раз за эти годы в различных сценариях. Так что еще раз спасибо, @DerfK. :)
Брайан Лейси
2
найти . -не-путь "* /. svn / *" -и -тип f -and -exec / bin / rm '{}' \;

Должен сделать трюк.

отметка
источник
Просто подсказка, но вместо -exec /bin/rm '{}'вас можно использовать -delete.
Аарон Копли