Як я можу видалити всі неперероблені / проігноровані файли / папки в робочій копії?


136

Якщо у мене є робоча копія сховища Subversion, чи є можливість видалити всі неперевершені або проігноровані файли з цієї робочої копії однією командою чи інструментом? По суті, я шукаю аналог SVN git clean.

Буде прийнятним або командний рядок, або рішення GUI (для TortoiseSVN).


Відповіді:


98

Використання TortoiseSVN:

  • клацніть правою кнопкою миші на папці робочої копії, утримуючи клавішу Shift
  • виберіть "видалити неперевершені елементи"

7
Приємна особливість! Мені довелося прочитати посилання, щоб дізнатись, що воно працює лише у поданні списку (а не у вигляді дерева) для XP - можливо, ви повинні це включити у свою відповідь.
Нік Мейєр

5
Чи версія версії командного рядка svn (конкретно для Windows) не забезпечує ту саму функцію?
вибухнув

3
Як хтось зазначив нижче:svn cleanup --remove-unversioned --remove-ignored .
Хай

133
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!
багатий

Чи потрібно скинути IFS? Я вирішив не робити сценарій "svnclean". тож мені цікаво, чи це викрутить IFS для решти сценарію ...
C. Tewalt

3
@matrixugly: Ні, вам не потрібно IFSповертатись до того, що було раніше. Коли ви робите VARNAME=value command, віднесення valueдо VARNAMEзастосовується тільки під час виконання command(з деякими винятками , які не належать до read). Детальнішу інформацію див. У специфікації POSIX та у цьому звіті про помилки POSIX .
Річард Хансен

@rich, дякую за те, що поділився цим. Кілька років тому прийшов шукати рішення для очищення svn, а також пішов з деякими знаннями сценаріїв оболонок! Очевидно, я досить мало повертався до цієї відповіді.
C. Tewalt

120

Я знаю, що це старе, але у випадку, якщо хтось інший натикається на нього, новіші версії (1.9 або новішої версії) підтримки svn --remove-unversioned, наприклад svn cleanup . --remove-unversioned.

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


18
Для мене це правильна відповідь. Це відповідь міжплатформенного командного рядка. Також ви можете видалити ігноровані файли за допомогоюsvn cleanup . --remove-ignored
Dan Atkinson

1
Працює в svn 1.6 і вище.
wegry

2
Будь ласка, змініть це на 1.9, див. Також subversion.apache.org/docs/release-notes/1.9.html (я спробував локально, і це не вийшло, і я перебуваю на 1.8.8)
ikku100

2
Здається, проблема полягає в тому, що вона не видаляє неперевершені папки .
Nyerguds

1
@Nyerguds: Правда, це не видаляє неперевірені папки, а лише файли без версії. Хтось знайшов рішення?
dhiraj suvarna

42

Цей oneliner може допомогти вам:

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

Використовуйте обережно!


13
це не видалить проігноровані файли та порушиться, якщо ім'я файлу містить пробіли
Річард Хансен,

1
Він також не видаляє ігноровані файли
plaisthos

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". Також додайте прапори для -recurse та -force до rm, щоб зробити цю команду неінтерактивною та настільки зручною у сценарії.


Команді потрібна додаткова подвійна цитата в кінці. Я просто додам, але редагування має бути не менше шести символів.
Ян Міллер

7

Багато речей у SVN можна зробити різними способами, про що свідчать різноманітні відповіді командного рядка, наведені тут. З появою версії 1.7 з'явилася ще одна техніка для TortoiseSVN, яка насправді забезпечує більш чітку роздільну здатність, ніж відповідь Стефана, дозволяючи вибирати неповернені файли окремо від ігнорованих файлів. Просто виберіть, TortoiseSvn >> Clean up...щоб відкрити це діалогове вікно.

Параметри очищення TortoiseSVN


7

З повноваженнями:

(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 був лише один файл. Це налаштування виправляє проблему: 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
Вам не потрібно використовувати діалог фіксації, і ви можете отримати ігноровані файли: Клацніть правою кнопкою миші | ЧерепахаSVN | Перевірте зміни. Потім ви можете натиснути "Показати проігноровані файли" та сортувати / видалити належним чином.
пх

4

Це схоже на інші відповіді, але насправді отримує ігноровані файли (зверніть увагу на "Я" в 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. :)


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/

Інший (жорстокий) метод - це внесення змін, видалення всіх із папки та оформлення замовлення ще раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.