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



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



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

660   11  

11 ответов:

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

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

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. выполнить 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")

Comments

    Ничего не найдено.