Команда 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
каждый файл
Ответ 4
Я только что нашел это, что делает трюк Удалить все "отсутствующие" файлы из рабочей копии SVN:
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
Ответ 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")