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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

  • Запустить статус svn
  • Искать строки, начинающиеся с "!" (Отсутствует)
  • Распечатайте аргумент "-force" (аргумент svn) и второй столбец (имя файла) вывода из # 2
  • Запустите svn rm, используя вывод # 3 в качестве аргументов

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

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

Литература:

Ответ 3

svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  • svn status
  • Отфильтровать только отсутствующие файлы
  • Вырезать восклицательный знак
  • Отфильтровать конечные пробелы
  • Добавить ключевую цитату
  • Добавить трейлинг-котировку
  • svn remove каждый файл

Ответ 5

Благодаря Paul Martin для версии Windows.

Ниже приведена небольшая модификация script, поэтому также учитываются файлы 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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Эта оболочка script рекурсивно исследует (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

Ответ 9

При работе с большим количеством файлов может случиться так, что аргумент, вводимый в 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 $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done

Ответ 10

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

Ответ 11

Фактически можно полностью удалить missing.list из user3689460 и Paul Martin

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