Как я могу удалить все неверсированные / проигнорированные файлы / папки в моей рабочей копии? - PullRequest
130 голосов
/ 10 мая 2010

Если у меня есть рабочая копия хранилища Subversion, есть ли способ удалить все неверсионные или проигнорированные файлы в этой рабочей копии с помощью одной команды или инструмента? По сути, я ищу SVN аналог git clean.

Будет приемлема либо командная строка, либо решение с графическим интерфейсом (для TortoiseSVN).

Ответы [ 12 ]

127 голосов
/ 05 февраля 2012
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Это имеет следующие особенности:

  • И игнорируемые, и неотслеживаемые файлы удаляются
  • Это работает, даже если имя файла содержит пробелы (кроме новой строки, но с этим ничего не поделаешь, кроме использования опции --xml и анализа полученного результата в xml)
  • Это работает, даже если svn status печатает другие символы состояния перед именем файла (чего не должно быть, потому что файлы не отслеживаются, но на всякий случай ...)
  • Должно работать в любой POSIX-совместимой системе

Я использую скрипт оболочки с именем svnclean, который содержит следующее:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done
97 голосов
/ 19 августа 2015

Я знаю, что это старый, но в случае, если кто-то еще наткнется на него, более новые версии (1.9 или более поздние) svn поддерживают --remove-unversioned, например. svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options

96 голосов
/ 11 мая 2010

Использование TortoiseSVN:

40 голосов
/ 10 мая 2010

Этот oneliner может помочь вам:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

Используйте с осторожностью!

14 голосов
/ 12 сентября 2012

Изменение ответов Yanal-Yves Fargialla и gimpf с помощью Powershell (но не разрешено комментировать исходное сообщение от Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

Это добавляет карат ("^") для указания начала строки, избегая сопоставления всех файлов, которые содержат букву "i". Также добавьте флаги для -recurse и -force в rm, чтобы сделать эту команду неинтерактивной и удобной для использования в скрипте.

7 голосов
/ 05 июля 2012

С PowerShell:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

Из командной строки:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
7 голосов
/ 11 июня 2012

Многие вещи в SVN могут быть выполнены по-разному, о чем свидетельствуют различные ответы командной строки, приведенные здесь. С появлением версии 1.7 для TortoiseSVN появилась еще одна методика, которая, фактически, обеспечивает более точное разрешение зерна, чем предоставленный ответ Стефана, позволяя вам выбирать не версионные файлы отдельно от игнорируемых файлов. Просто выберите TortoiseSvn >> Clean up..., чтобы открыть это диалоговое окно.

TortoiseSVN cleanup options

5 голосов
/ 11 июля 2012

Этот oneliner работает для меня (основываясь на ответе Ричарда Хансена, который неожиданно не сработал для файлов, содержащих пробелы):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
5 голосов
/ 10 мая 2010

Использование TortoiseSVN:

  1. Щелкните правой кнопкой мыши по корню рабочей копии и выберите TortoiseSVN -> «проверить наличие изменений»
  2. Выберите «Показать игнорируемые файлы»
  3. Сортировать по столбцу «Статус текста»
  4. прокрутка до «не версионных» файлов, теперь все сгруппированы вместе; выберите их все и щелкните правой кнопкой мыши -> удалить
  5. Прокрутите до «игнорируемых» файлов, теперь все сгруппированы вместе; выделите их все и щелкните правой кнопкой мыши -> удалить

Не совсем хорошее и чистое решение, но самый быстрый из известных мне (в Windows).

Спасибо pkh за подсказку с игнорируемыми файлами.

4 голосов
/ 17 октября 2014

Кто-то сказал, что вы не можете сделать это из командной строки Windows.

Bull.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

Делает это в одну строку и не требует одного инструмента GNU. :)

...