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

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

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

Ответ 1

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

Ответ 2

svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Это имеет следующие функции:

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

Я использую оболочку script с именем 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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

TortoiseSVN cleanup options

Ответ 7

С powershell:

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

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

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

Ответ 8

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

  • Щелкните правой кнопкой мыши по корню рабочей копии и выберите TortoiseSVN → "проверить на наличие изменений"
  • Выберите "Показать проигнорированные файлы"
  • Сортировка по столбцу "Статус текста"
  • прокрутите до "не-версий" файлов, теперь все сгруппированы вместе; выберите их все и щелкните правой кнопкой мыши → удалить
  • прокрутите до "проигнорированных" файлов, теперь все сгруппированы вместе; выберите их все и щелкните правой кнопкой мыши → удалить

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

Благодаря pkh для чата с игнорируемыми файлами.

Ответ 9

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

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

Ответ 10

Это похоже на другие ответы, но фактически получает проигнорированные файлы (обратите внимание на "I" в RE):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`

Ответ 11

Кто-то сказал, что вы не можете сделать это из командной строки 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.:)

Ответ 12

вы не можете удалить их только с помощью командной строки SVN (хотя не уверены в инструментах графического интерфейса), если вы находитесь под Linux-системой, это может помочь:

http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/

Другим (жестоким) методом является фиксация изменений, удаление всех из папки и проверка снова.