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

138

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

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

Ник Мейер
источник
1
Возможный дубликат автоматического удаления неверсированных файлов Subversion
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

98

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

Стефан
источник
7
Приятная особенность! Однако мне пришлось прочитать ссылку, чтобы узнать, что она работает только в виде списка (а не в виде дерева) в XP - возможно, вам стоит включить это в свой ответ.
Ник Мейер,
5
Версия svn для командной строки (особенно в Windows) не предоставляет ту же функцию?
blong
5
Как кто-то указал ниже:svn cleanup --remove-unversioned --remove-ignored .
haui
135
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
Ричард Хансен
источник
2
Именно то, что я искал, прекрасно работает и на Linux, и на MacOS!
rich
Вам нужно сбросить IFS? Я решил не создавать сценарий svnclean. так что мне интересно, испортит ли это IFS для остальной части сценария ...
C. Tewalt
3
@matrixugly: Нет, вам не нужно IFSвозвращаться к тому, что было раньше. Когда вы это сделаете VARNAME=value command, присвоение valueto VARNAMEприменяется только во время выполнения command(с некоторыми исключениями, которые не относятся к read). См. Спецификацию POSIX и этот отчет об ошибках POSIX для получения более подробной информации.
Ричард Хансен
@rich, спасибо, что поделились этим. Пришел в поисках решения для очистки svn несколько лет назад, а также ушел с некоторыми знаниями сценариев оболочки! Очевидно, я довольно долго возвращался к этому ответу.
C. Tewalt
125

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

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

Нил
источник
19
Для меня это правильный ответ. Это кроссплатформенный ответ командной строки. Также вы можете удалить игнорируемые файлы с помощьюsvn cleanup . --remove-ignored
Дэн Аткинсон
1
Работает в svn 1.6 и выше.
Wegry
3
Пожалуйста, измените это на 1.9, см. Также subversion.apache.org/docs/release-notes/1.9.html (я пробовал локально, но это не сработало, у меня 1.8.8)
ikku100
2
Кажется, проблема в том, что он не удаляет неверсированные папки .
Nyerguds
1
@Nyerguds: Да, это не удаляет не версированные папки, а только не версированные файлы. Кто-нибудь нашел решение?
дхирадж суварна
43

Этот лайнер может вам помочь:

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

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

Jkramer
источник
13
при этом игнорируемые файлы не удаляются, а если имя файла содержит пробелы, происходит сбой
Ричард Хансен
1
Он также не удаляет игнорируемые файлы
plaisthos 08
4
Вы можете использовать svn status --no-ignoreдля записи игнорируемых файлов.
Codure
3
Фактически, я считаю, что это возможность оставлять игнорируемые файлы на месте, при желании.
macetw
15

Изменение ответов Янала-Ива Фаргиаллы и gimpf с помощью Powershell (но не разрешено комментировать исходное сообщение Stackoverflow):

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

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

гвилк
источник
В конце команды требуется дополнительная двойная кавычка. Я бы просто добавил его, но, по-видимому, правка должна содержать не менее шести символов.
Ян Миллер
7

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

Параметры очистки TortoiseSVN

Майкл Соренс
источник
7

С PowerShell:

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

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

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
Янал-Ив Фаргиалла
источник
3
Мне нравится этот чистый скрипт Windows! Я бы рекомендовал использовать -match '[\?i]' -replace '^.{8}'вместо этого, который работает правильно, даже если имя файла начинается с пробела, а также удаляет игнорируемые файлы.
gimpf
1
Использование предлагаемой настройки gimpf работает хорошо, но я столкнулся со случаем, когда я обнаружил исключение ItemNotFoundException. Оказывается, в наборе результатов svn status был только один файл. Эта настройка устраняет эту проблему: code@ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm `. Разобрался с помощью этого поста
dirtybird
1
и поскольку при этом будет предложено указать каталоги, не входящие в svn (поскольку рекурсивный код не указан), его нельзя использовать в сценарии. Использование:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber
6

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

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
Денис Голомазов
источник
2
для удаления неверсированных папок также добавьте -frв rmкоманду: svn status --no-ignore | grep '^ [I?]' | вырезать -c 9- | xargs -d "\ n" -I {} rm -fr {}
Денис Голомазов
5

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

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

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

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

Томас Лётцер
источник
Я считаю, что это удалит только файлы без версий. Игнорируемые элементы не будут затронуты.
Дирк Фольмар
2
Вам не нужно использовать диалог фиксации, и вы можете получить игнорируемые файлы: Щелкните правой кнопкой мыши | TortoiseSVN | Проверьте наличие изменений. Затем вы можете нажать «Показать игнорируемые файлы» и отсортировать / удалить соответствующим образом.
пкх
4

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

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
пх
источник
1
это прерывается, если имя файла содержит пробелы
Ричард Хансен
4

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

Дроссели McGee
источник
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")
Дариен Пардинас
@DarienPardinas, ваша версия особенно полезна , если закупорка в Дженкинс «Выполнить Windows , пакетную команду», которую я только что узнал , не командная строка , но больше как пакетный сценарий, поэтому потребность в %%более%
jxramos
1

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

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

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

Юрий
источник