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

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

приемлемым было бы решение командной строки или GUI (для TortoiseSVN).

12 ответов


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


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

это имеет следующие характеристики:

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

я использую shell-скрипт с именем 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

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

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


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

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

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


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

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

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


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

TortoiseSVN cleanup options


С powershell:

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

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

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

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

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

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

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


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

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

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

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

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

бык.

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. :)


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

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

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