Команда SVN для удаления всех локально отсутствующих файлов
в SVN есть команда, которую я могу использовать для удаления всех локально отсутствующих файлов в каталоге?
или в противном случае, каким-то образом перечислить только те файлы, которые отсутствуют (или, в более общем случае, имеют статус A, D,?, прием.)
11 ответов:
Если вы используете TortoiseSVN, просто сделайте проверять наличие изменений, отсортируйте статус столбец, выберите все записи, отмеченные
missingщелкните правой кнопкой мыши для открытия контекстного меню и выберите удалить. Наконец, зафиксируйте публикацию изменений в репозитории.Если вы находитесь на Windows, но предпочитаете командную строку и любите баловаться в PowerShell, этот однострочный будет делать трюк:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }то есть, фильтровать вывод только для тех строк, которые показывают отсутствующие файлы (обозначенные восклицанием в начале строки), захватите соответствующее имя файла и выполните
svn rmна имя файла.(сообщение в блоге удалите все "отсутствующие" файлы из рабочей копии SVN делает что-то подобное для Unix/Linux.)
Если вы используете Mac (Дарвин) или Linux вы можете передать выходные данные следующих команд в
svn rmдля всех отсутствующих файлов. Вы можете установить текущий рабочий каталог в соответствующий каталог или подкаталог перед их запуском - в зависимости от того, хотите ли вы запустить всю свою рабочую копию или только подмножество.
- запустите статус svn
- Поиск строк, которые начинаются с "!"(отсутствует)
- вывести "--force " (svn аргумент) и второй столбец (имя файла) вывода из #2
- выполнить
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
svn status- фильтр только по отсутствующим файлам
- вырезать восклицательным знаком
- отфильтровать конечные пробелы
- добавить ведущие цитата
- добавить конечную цитату
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