2011-01-05 4 views
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

Вы пробовали? Почему бы не сделать это самостоятельно, а не ждать ответа? – viraptor

+0

@viraptor Я только что пробовал, он не работает – aneuryzm

+0

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

ответ

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

У меня есть вопрос об этом. Если я удалю файл, я потеряю все предыдущие версии? Другими словами, я больше не могу вернуть его? Таким образом, все предыдущие обязательства также удалены? – aneuryzm

+0

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

+1

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

2

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

svn add --force . 

или

svn --force add . 

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

+0

Сценарий OP работает рекурсивно - этого метода нет. – Mortoc

+3

почему? Я проверил его, он работает рекурсивно – sdespolit

40

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

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

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

+1

Это потрясающе и отлично работает. –

+3

Спасибо! он работает даже с пробелами в именах файлов :) –

+1

! Потрясающие. Решительно удаляли мои пробелы в имени. – WernerCD

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 (или я чего-то не хватает?) – HughHughTeotl

+0

Активировано для '-d '\ n'' вариант! – Mitchapp

Смежные вопросы