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


114

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

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

  0

Возможный дубликат [Автоматическое удаление файлов Subversion неверсированные] (http://stackoverflow.com/questions/239340/automatically-remove-subversion-unversioned-files) 12 дек. 162016-12-12 13:28:16

91

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

  • правой кнопкой мыши на рабочую папку копировать, while holding the shift-key down
  • выбрать "удалить неверсированные элементы"
+7

Хорошая особенность! Я должен был прочитать ссылку, однако, чтобы узнать, что она работает только в представлении списка (а не на дереве) на XP - возможно, вы должны включить это в свой ответ. 11 май. 102010-05-11 20:40:18

+5

Имеет ли версия командной строки svn (в частности, окна) не такую ​​же функцию? 16 мар. 122012-03-16 13:06:00

+1

@blong: Нет, вы не можете сделать это из командной строки Windows. 03 окт. 142014-10-03 21:55:04


34

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

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

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

+13

это не снимает игнорируемых файлов и будет break, если имя файла содержит пробелы 04 фев. 122012-02-04 21:57:16

+1

Он также не удаляет игнорируемые файлы. 08 янв. 132013-01-08 20:38:23

+4

Вы можете использовать 'svn status --no-ignore' для захвата игнорируемых файлов. 09 апр. 132013-04-09 18:57:23

+3

Фактически, я считаю, что это возможность оставить на месте проигнорированные файлы, необязательно. 31 янв. 142014-01-31 20:02:10

  0

Как это можно сделать с помощью командной строки Windows? 21 дек. 162016-12-21 13:07:20


1

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

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

The (брутальный) иной методом является зафиксировать изменения, удалить все из папки и проверить еще раз.


4

Это похоже на другие ответы, но на самом деле получает игнорируемые файлы (обратите внимание на «Я» в УЭ):

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

Это прерывается, если имя файла содержит пробелы 04 фев. 122012-02-04 22:05:48


5

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

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

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

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

  0

Я считаю, что это удалит только файлы без версии. Игнорируемые элементы не будут затронуты. 10 май. 102010-05-10 15:31:52

  0

@ 0xA3 true, я отредактирую ответ. Спасибо за подсказку 10 май. 102010-05-10 15:36:26

+2

Вам не нужно использовать диалог фиксации, и вы можете проигнорировать файлы: Щелкните правой кнопкой мыши | TortoiseSVN | Проверьте изменения. Затем вы можете нажать «Показать проигнорированные файлы» и отсортировать/удалить соответствующим образом. 10 май. 102010-05-10 15:38:59


116
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! 29 ноя. 132013-11-29 09:38:00

  0

Вам нужно сбросить IFS? Я решил не писать сценарий svnclean. поэтому мне интересно, будет ли это испортить IFS для остальной части скрипта ... 11 апр. 142014-04-11 21:51:47

+3

@matrixugly: Нет, вам не нужно менять 'IFS' обратно на то, что было раньше. Когда вы выполняете 'VARNAME = значение command', присвоение' value' 'VARNAME' применяется только во время выполнения' command' (с некоторыми исключениями, которые не применяются к 'read'). См. [Спецификация POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09) и [этот отчет об ошибке POSIX] (http://austingroupbugs.net/view.php?id = 654 # c1559) для более подробной информации. 12 апр. 142014-04-12 05:27:05

  0

@rich, спасибо, что поделились этим. Пришел искать решение для очистки svn несколько лет назад, а также ушел с некоторыми знаниями об использовании оболочки! Очевидно, я возвращаюсь к этому ответу совсем немного. 13 июл. 162016-07-13 14:37:31


7

Многие вещи в 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}" 
+3

Мне нравится этот чистый сценарий Windows! Я бы рекомендовал вместо этого использовать '-match '[\? I]' -replace '^. {8}'', который работает корректно, даже если имя_файла _starts_ с пробелом, а также удаляет проигнорированные файлы. 25 июл. 122012-07-25 21:16:42

+1

Использование предложенной настройки gimpf хорошо работает, но я столкнулся с ситуацией, когда столкнулся с ItemNotFoundException. Оказывается, в наборе результатов svn был только один файл. Эта настройка исправляет эту проблему: 'code' @ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm '. Выяснил это с помощью [этого сообщения] (http://stackoverflow.com/questions/8651905/powershell-match-operator-returns-true-but-matches-is-null) 11 сен. 132013-09-11 19:02:24

+1

и потому что это подскажет вам каталоги не в svn (поскольку recurse не был указан), это не подходит для использования в скрипте. Используйте: 'powershell -Command '& {(svn status -no-ignore) -match' [\? I] '-replace' ^. {8} '| remove-item -force -recurse}" ' 29 окт. 142014-10-29 08:40:26


5

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

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

, чтобы удалить неверсированные папки, добавьте команду '-fr' в' rm': svn status --no-ignore | grep '^ [I?]' | cut -c 9- | xargs -d "\ n" -I {} rm -fr {} 24 июл. 122012-07-24 07:29:57


14

Модифицирование Янал-Ив Fargialla и ответы gimpf использует Powershell (но не разрешено комментировать исходное сообщение по Stackoverflow):

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

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

  0

Команде требуется дополнительная двойная кавычка в конце. Я бы просто добавил его, но редактирование должно быть как минимум шести символов. 08 фев. 172017-02-08 15:52:05


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

  0

'to/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") ' 13 ноя. 152015-11-13 00:16:40

  0

@DarienPardinas, ваша версия особенно полезна, если подключиться к Jenkins« Выполнять пакетную команду Windows », которую я только что узнал, не является командной строкой но больше похоже на пакетный скрипт, поэтому необходимость '%%' над '%' 16 июн. 162016-06-16 21:08:27


63

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

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

+12

Для меня это правильный ответ. Это кросс-платформенный ответ командной строки. Кроме того, вы можете удалить игнорируемые файлы с помощью 'svn cleanup. --remove-ignored' 16 май. 162016-05-16 12:58:35

+1

Работает в svn 1.6 и выше. 09 сен. 162016-09-09 15:30:53

+1

Пожалуйста, измените это на 1.9, см. Также https://subversion.apache.org/docs/release-notes/1.9.html (Я пробовал локально, и он не работал, и я на 1.8.8) 11 окт. 162016-10-11 16:00:42

  0

Пробовал это, на v1.9.4, который пришел с TortoiseSVN, и переключатель, казалось, не имел никакого эффекта. 24 ноя. 162016-11-24 10:03:53

+2

Кажется, проблема в том, что он не удаляет неверсированные _folders_. 24 ноя. 162016-11-24 10:19:00

  0

@Nyerguds: Правда, это не удаляет папки без версий, а только файлы без версии. Кто-нибудь нашел решение? 21 дек. 162016-12-21 13:14:31

  0

@phoenix Я закончил тем, что написал небольшой инструмент командной строки C#, который вызывает 'svn status --depth = infinity -v --xml' и анализирует это, чтобы выяснить, какие файлы удалить. Просто нужно быть осторожным, чтобы игнорировать папку .svn. 21 дек. 162016-12-21 14:05:59

  0

Этот переключатель только что удалил неверсированные папки для меня. 14 авг. 172017-08-14 12:23:34