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


134

У SVN є команда, яку я можу використовувати, щоб видалити всі локально відсутні файли в каталозі?

Або, якщо цього не зробити, певний спосіб перерахувати лише ті файли, які відсутні (або, у більш загальному випадку, мають статус A, D,? Тощо)


1
Я підтримую 1 робочу папку та 1 папку замовлення. І переміщуйте лише файли з робочої папки в папку перевірки. Якщо папку потрібно додати / видалити, я роблю це вручну, а потім переміщую файли у цю папку (наприклад, нові пакунки, старі пакунки). Більшість проблем з svn трапляються під час переміщення папок на робочій копії. Навіть коли копіюєте файли з вашої робочої копії для отримання копії, ви повинні переміщати лише файли, а не папки.
Сіддхарт

Відповіді:


99

Якщо ви використовуєте TortoiseSVN, просто зробіть пункт « Перевірка змін» , сортуйте стовпчик « Стан» , виберіть усі записи, позначені missing, клацніть правою кнопкою миші, щоб відкрити контекстне меню та виберіть « Видалити» . Нарешті, зобов’язатись опублікувати зміни у сховищі.

Якщо ви перебуваєте в ОС Windows, але віддаєте перевагу командному рядку і насолоджуєтесь даблом в PowerShell, цей однокласник виконає трюк:

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

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

(Запис у блозі Видалення всіх "відсутніх" файлів із робочої копії SVN робить щось подібне для Unix / Linux.)


чи є спосіб у затемненні за допомогою плагіна subclipse? так погано оновити, потім знайти їх у проекті та видалити їх знову.
Стен

FYI, якщо тут потрібен пароль субверсії - це синтаксис: статус svn - ім'я користувача-ім’я_тука - пароль пароля_тут | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Матчі [1] --користувач ім'я_користувача_тут - пароль password_here}
Jeff

ви повинні спочатку скористатися після цього рядка перед виконанням svn up? тому що файли відновлюються з сервера svn
Pierre

Чи видалить ця дія також файли з сховища?
Себастьян Уллоа

175

Якщо ви використовуєте 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

Список літератури:


4
Це не працює, якщо у назві файлу є пробіли. Я не знаю достатньо awk, щоб виправити це.
bugloaf

2
Використовуйте, awk '{print " --force "$2"@"}'якщо ваше ім’я файлу містить @(якщо ви, наприклад, розробник iOS)
Гійом Альгіс

1
І обробляйте ім’я файлу з пробілами, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'повинні робити трюк (і починає виглядати некрасиво)
Гійом Альгіс

12
Повна команда, що піклується про простір, - "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
HelloWorld

1
Чому ви не --forceвведете в частину xargs?
jwg

53
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 кожен файл

Це рішення працює, якщо у файлах / каталогах є пробіли.
юрій

Як до цього додати багатослівність? xargs -вербовий svn rm?
TekiusFanatikus

1
Просто натяк для користувачів сценаріїв тощо. Ця команда не вдається, якщо файлів для видалення не знайдено: svn: E205001: Спробуйте 'svn help delete' для отримання додаткової інформації svn: E205001: Недостатньо аргументів
Thorsten Schöning

1
@ Проблему ThorstenSchöning можна усунути, додавши -rдо xargsпараметрів (не запускати, якщо ні аргументи не наводяться). Крім того, число аргументів має бути обмеженим, а видалення - пакетним, оскільки виклик не вдається з дуже великою кількістю файлів для видалення, наприклад -n 500. І останнє, але не менш важливе, виконане цитування є неоптимальним для файлів, що містять спеціальні оболонки типу $- краще використовувати \nяк роздільник і залишити цитування xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui


19

Дякую Полу Мартіну за версію Windows.

Ось невелика зміна сценарію, тому файли Windows з пробілами також враховуються. Також missing.listфайл буде видалено наприкінці.

Я зберігав наступне у svndel.bat у своєму каталогу 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

приємно бачити, що інноваційний пакетний код все ще з’являється :)
user230910

Вау, чудова відповідь. Я збирався поїхати з повноваженнями, але це було набагато простіше.
Джим Андракакіс

Я додав ще один рядок після del missing.list 2>NUL, тому що я додав усі нові файли безпосередньо після першого видалення видалених файлів, щоб він додався missing.listдо svn: svn delete "missing.list"працював для мене
Pierre

Я змінив цей скрипт, щоб спробувати запустити з довільного місця, потім зіткнувся з цією проблемою stackoverflow.com/questions/1137219/…, тому, здається, Ви ПОВИННІ використовувати поточний робочий каталог для виконання цієї дії.
aolszowka

7

Мені подобається варіант PowerShell ... Але ось ще один варіант, якщо ви використовуєте пакетні сценарії Windows:

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

5

Альтернатива, яка працює в Linux (bash) для файлів, що підлягають видаленню, не містять пробілів у шляху:

svn видалити `svn статус | греп! | awk '{print $ 2}' `

4

Цей скрипт оболонки рекурсивно вивчає ( 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

4

Невелика модифікація командного рядка, який працює на 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

4

Насправді можливо повністю видалити користувача missing.listuser3689460 та Paul Martin

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

для довідки - це DOS / cmd.exe у windows land
user230910

2

Маючи справу з великою кількістю файлів, може статися так, що введення аргументу до 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

1

Поліпшена версія

Отже, повна команда:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.