Команду SVN удалить все локально недостающие файлы

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

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

11 ответов


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

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

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

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

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


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

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

таким образом, полная команда:

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

ссылки:


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 каждый файл

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

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )

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

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

Я сохранил следующее в svndel.bat в моем каталоге SVN bin (установлен в моей среде % % 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

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

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)

альтернатива, которая работает в Linux (bash) для удаляемых файлов, не содержащих пробелов в пути:

svn delete `svn status | grep ! | awk '{print }'`

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

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

ROOT=

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

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


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

done

небольшая модификация командной строки, которая работает на 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

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

Это для Linux:

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status  | grep -E '^!' | awk '{print }')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done

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

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")