Как удалить все удаленные файлы из хранилища?


44

У меня есть сценарий, в котором я добавляю все новые файлы, прежде чем совершить свою рабочую копию на мой репозиторий с этой строкой:

svn status | grep ^\? | awk '{print $2}' | xargs svn add 

Теперь я хочу, чтобы добавить строку, удалить из хранилища всех удаленных файлов в моем рабочем копия. Другими словами, я не могу указать их один за другим, и мне нужно обнаружить их со статусом svn, а затем автоматически удалить их. Однако линия не работает.

svn status | grep ^\! | awk '{print $2}' | xargs svn --force delete 

Как вы можете видеть, я заменил

"?" с "!" и

"add" с "--force delete"

Не могли бы вы сказать мне, почему это Безразлично» т работы?

пс. Я знаю, что это рискованная процедура. Я уже обсуждал все это. благодаря

благодарит

  0

Вы пробовали? Почему бы не сделать это самостоятельно, а не ждать ответа? 05 янв. 112011-01-05 20:25:02

  0

@viraptor Я только что пробовал, он не работает 05 янв. 112011-01-05 20:48:44

  0

Проблема в том, что вы пытаетесь удалить файлы, отмеченные восклицательным знаком, что означает, что что-то не так. Это означает, что вы удалили этот файл по команде операционной системы вместо svn delete, какой SVN не нравится ...... Проблема я не понимаю ... как вы сделали удаление файлов, которые вы сейчас хотите сделать постоянным svn rm --force? 05 янв. 112011-01-05 21:16:57

  0

@khmarbaise Я делаю это постоянно с php-скриптом. Я сейчас, это звучит неправильно и, вероятно, я не буду использовать его. Я просто хочу заставить скрипт работать. 05 янв. 112011-01-05 21:20:48

  0

У вас есть сообщение об ошибке? 05 янв. 112011-01-05 22:05:23

  0

Надеюсь, я не усложняю вещи, но вы знаете, что вы удалите их из головы, не так ли? Они по-прежнему могут быть восстановлены путем проверки более ранней версии. Если вы делаете стандартное управление версиями кода, это именно то, что вы хотите! Если вы помещаете неправильный материал в svn (например, конфиденциальный материал в публичном репо), тогда вам нужно что-то еще 26 июн. 122012-06-26 08:14:08

59

Я просто попытался это, и это работает прекрасно.

$ svn st | grep '^!' | awk '{print $2}' | xargs svn delete --force 
D   groups.pl 
D   textblock.pl 

У ваших файлов есть пробелы в именах?

ПОДОЖДИТЕ ВТОРОЙ !! Я вижу проблему. У вас есть:

svn --force delete 

и нет:

svn delete --force 

--force является параметром команды delete и не команда svn.

  0

У меня есть вопрос об этом. Если я удалю файл, я потеряю все предыдущие версии? Другими словами, я больше не могу вернуть его? Таким образом, все предыдущие обязательства также удалены? 06 янв. 112011-01-06 08:02:36

  0

Он по-прежнему не работает ... но я сейчас думаю об использовании такого инструмента, как rsync, для создания резервных копий моих файлов (этот комментарий не может быть и речи, но я понял, что не могу использовать svn, как это) 06 янв. 112011-01-06 08:33:07

+1

Да, вы можете получить файл, который был удален. Вам нужно найти ревизию каталога с удаленным файлом и использовать фиксацию ревизии («@» в конце URL-адреса). Оттуда вы можете скопировать недостающий файл в текущую версию. Вы также можете выполнить обратное слияние, чтобы отменить все ваши изменения. На самом деле, одна из жалоб на svn заключается в том, что вы не можете полностью удалить (уничтожить) файл, если вы передали файл, который вы не предполагали (например, ваш пароль). 06 янв. 112011-01-06 19:43:30

+1

Для чего-то, что не задыхается от файлов в проекте xCode (изображения с символом «@»): svn st | grep '^!' | awk '{print $ 2}' | xargs -I файл svn удалить файл @ 15 мар. 132013-03-15 15:49:37

  0

Это не работает для файлов с пробелами и специальными символами. Ответ anton_rh. 23 дек. 162016-12-23 11:49:40


2

, что о добавлении вы могли бы просто использовать

svn add --force . 

или

svn --force add . 

он будет делать то же самое: добавить неверсированные файлы, кроме тех, соответствующих СВЕН: игнорировать узоры

  0

Сценарий OP работает рекурсивно - этого метода нет. 16 фев. 122012-02-16 21:36:29

+3

почему? Я проверил его, он работает рекурсивно 17 фев. 122012-02-17 09:02:45


40

Я нашел другое решение.

svn status | grep '^\!' | sed 's/! *//' | xargs -I% svn rm % 

Я видел его на http://donunix.blogspot.de/2009/02/svn-remove-all-deleted-files.html

+1

Это потрясающе и отлично работает. 23 сен. 122012-09-23 20:22:38

+3

Спасибо! он работает даже с пробелами в именах файлов :) 24 окт. 122012-10-24 17:25:05

+1

! Потрясающие. Решительно удаляли мои пробелы в имени. 22 фев. 132013-02-22 18:06:15

+2

Отличный сценарий. Работает также с пробелами 04 сен. 132013-09-04 10:58:10


2

подход с использованием PERL Oneliner будет:

svn st | perl -ne 'print "$1\n" if /^\!\s+(.*)/' | xargs svn rm 

это также должно работать с пробелами в именах файлов.

изменения: улучшена регулярное_выражение


5
svn status | grep '^!' | sed 's/! *//' | xargs -d '\n' svn delete --force 

решение работает для имен файлов с пробелами и специальными символами.

  • svn status - списки все изменения, удаленные файлы помечаются как !
  • grep '^!' - извлекает строки, которые начинаются с ! (т.е. удаленные файлы)
  • sed 's/! *//' - удаляет ! -char в начале и пробелы после него
  • xargs -d '\n' - обрабатывает каждую строку ввода (включая пробелы и специальные символы) в качестве отдельного аргумента и передает их svn delete --force
  0

FYI опция '-d'' xargs' не поддерживается в OS X - так, кажется, работает только для Linux (или я чего-то не хватает?) 30 ноя. 152015-11-30 15:48:13

  0

Активировано для '-d '\ n'' вариант! 16 июн. 172017-06-16 08:15:43