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

134

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

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

wheresrhys
источник
1
У меня есть 1 рабочая папка и 1 кассовая папка. И перемещать только файлы из рабочей папки в папку извлечения. Если папку необходимо добавить / удалить, я делаю это вручную, а затем перемещаю файлы в эту папку (например, новые пакеты, старые пакеты). Большинство проблем с svn возникает при перемещении папок в рабочей копии. Даже при копировании файлов из рабочей копии в контрольную копию следует перемещать только файлы, а не папки.
Сиддхартх

Ответы:

99

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

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

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

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

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

Майкл Соренс
источник
есть ли способ в eclipse с использованием плагина subclipse? так плохо обновлять, а затем находить их в проекте и снова удалять.
Стэн
К вашему сведению, если требуется пароль для подрывной деятельности, вот его синтаксис: svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Соответствует [1] --username user_name_here - password password_here}
Джефф
следует ли сначала выполнить фиксацию после этой строки перед выполнением svn up? потому что файлы восстанавливаются с svn сервера
Пьер
Удалит ли это действие и файлы из репозитория?
Себастьян Уллоа
176

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

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

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

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

Ссылки:

Петр Айтай
источник
4
Это не работает, если в имени файла есть пробелы. Однако я не знаю достаточно awk, чтобы это исправить.
bugloaf 08
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 каждый файл
ivrin
источник
Это решение работает, если в файлах / каталогах есть пробелы.
yuric
Как добавить к этому многословия? xargs -verbose svn rm?
TekiusFanatikus
1
Просто подсказка для пользователей скриптов и т. Д., Эта команда не работает, если файлы для удаления не найдены: svn: E205001: Попробуйте 'svn help delete' для получения дополнительной информации svn: E205001: Недостаточно аргументов
Торстен Шёнинг
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 в моем каталоге 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
user3689460
источник
приятно видеть, что какой-то инновационный пакетный код все еще появляется :)
user230910
Вау, отличный ответ. Я собирался использовать PowerShell, но это было намного проще.
Джим Андракакис
Я добавил еще одну строку после del missing.list 2>NUL, потому что я добавил все новые файлы сразу после первого удаления удаленных файлов, поэтому он добавлен missing.listв svn: svn delete "missing.list"у меня сработало
Пьер
Я изменил этот сценарий, чтобы попытаться запустить из произвольного места, а затем столкнулся с этой проблемой 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 delete `svn status | grep! | 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
cibercitizen1
источник
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.listиз user3689460 и Paul Martin

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Amfasis
источник
для справки - это 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
Zeta
источник