Команда SVN для удаления всех локально отсутствующих файлов - PullRequest
122 голосов
/ 07 марта 2012

В SVN есть команда, которую я могу использовать для удаления всех локально отсутствующих файлов в каталоге?

Или если это не удастся, каким-то образом перечислить только те файлы, которые отсутствуют (или, в более общем случае, имеют статус A, D,? И т. Д.)

Ответы [ 12 ]

165 голосов
/ 12 декабря 2012

Если вы используете Mac ( Darwin ) или Linux, вы можете направить выходные данные следующих команд в svn rm для всех отсутствующих файлов. Вы можете установить текущий рабочий каталог в соответствующий каталог или подкаталог перед их запуском - в зависимости от того, хотите ли вы запустить всю вашу рабочую копию или только подмножество.

  1. Запустить статус SVN
  2. Поиск строк, начинающихся с "!" (Отсутствует)
  3. Вывести «--force» (аргумент svn) и второй столбец (имя файла) вывода из # 2
  4. Запустите svn rm, используя выходные данные # 3 в качестве аргументов

Итак, полная команда:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

Ссылка:

93 голосов
/ 09 марта 2012

Если вы используете TortoiseSVN, просто выполните Проверка на наличие изменений , сортируйте по столбцу Status , выберите все записи, отмеченные missing, щелкните правой кнопкой мыши, чтобы открыть контекстменю и выберите Удалить .Наконец, подтвердите публикацию изменений в репозитории.

Если вы работаете в Windows, но предпочитаете командную строку и наслаждаетесь работой в PowerShell, эта однострочная работа поможет:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

То есть отфильтруйте вывод только по тем строкам, которые показывают отсутствующие файлы (обозначены восклицательным знаком в начале строки), запишите имя связанного файла и выполните svn rm для этого имени файла.

(запись в блоге Удалите все «отсутствующие» файлы из рабочей копии SVN делает нечто подобное для Unix / Linux.)

48 голосов
/ 25 августа 2014
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Фильтр только по отсутствующим файлам
  3. вырезать восклицательный знак
  4. Отфильтровать конечные пробелы
  5. Добавить ведущую цитату
  6. Добавить завершающую цитату
  7. svn remove каждый файл
29 голосов
/ 07 марта 2012

Я только что нашел это, что делает трюк, Удалите все «отсутствующие» файлы из рабочей копии SVN :

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
15 голосов
/ 30 мая 2014

Спасибо Полу Мартину за версию для Windows.

Вот небольшая модификация скрипта, поэтому файлы Windows с пробелами также учитываются. Также файл missing.list будет удален в конце.

Я сохранил следующее в файле svndel.bat в моем каталоге bin SVN (установленном в моей среде %% PATH), чтобы его можно было вызывать из любой папки в командной строке.

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL
6 голосов
/ 07 февраля 2013

Мне нравится опция PowerShell ... Но вот еще один вариант, если вы используете пакетные сценарии Windows:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
4 голосов
/ 11 марта 2016

Альтернатива, которая работает в Linux (bash) для файлов, которые должны быть удалены, не затрагивая пробелы в пути:

svn delete `svn status | grep ! | awk '{print $2}'`
3 голосов
/ 22 сентября 2017

На самом деле можно полностью удалить missing.list от пользователя 3689460 и Пола Мартина

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
3 голосов
/ 22 апреля 2016

Небольшое изменение командной строки, которое работает в Mac OS (возможно, даже в Linux) и справляется с файлами, о которых сообщает команда «svm sr», например «! M» (отсутствует и изменено).

Он справляется с пробелами в файлах.

Он основан на модификации предыдущего ответа:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm
3 голосов
/ 27 января 2013

Этот сценарий оболочки рекурсивно исследует (svn status) каталогов в вашем проекте, удаляя отсутствующие файлы (как требует вопрос) и , добавляя новые файлы в хранилище. Это своего рода «сохранение в репозитории текущего снимка проекта».

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...