У SVN є команда, яку я можу використовувати, щоб видалити всі локально відсутні файли в каталозі?
Або, якщо цього не зробити, певний спосіб перерахувати лише ті файли, які відсутні (або, у більш загальному випадку, мають статус A, D,? Тощо)
У SVN є команда, яку я можу використовувати, щоб видалити всі локально відсутні файли в каталозі?
Або, якщо цього не зробити, певний спосіб перерахувати лише ті файли, які відсутні (або, у більш загальному випадку, мають статус A, D,? Тощо)
Відповіді:
Якщо ви використовуєте TortoiseSVN, просто зробіть пункт « Перевірка змін» , сортуйте стовпчик « Стан» , виберіть усі записи, позначені missing
, клацніть правою кнопкою миші, щоб відкрити контекстне меню та виберіть « Видалити» . Нарешті, зобов’язатись опублікувати зміни у сховищі.
Якщо ви перебуваєте в ОС Windows, але віддаєте перевагу командному рядку і насолоджуєтесь даблом в PowerShell, цей однокласник виконає трюк:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
Тобто, відфільтруйте вихід лише до тих рядків, де відображаються файли, що відсутні, (позначені знаком оклику на початку рядка), зафіксуйте пов'язане ім’я файлу та виконайте svn rm
ім'я цього файлу.
(Запис у блозі Видалення всіх "відсутніх" файлів із робочої копії SVN робить щось подібне для Unix / Linux.)
svn up
? тому що файли відновлюються з сервера svn
Якщо ви використовуєте Mac ( Darwin ) або Linux, ви можете передавати виводи наступних команд svn rm
для всіх відсутніх файлів. Ви можете встановити поточний робочий каталог у відповідний каталог або підкаталог перед його запуском - залежно від того, чи хочете ви запустити цю всю свою робочу копію чи лише підмножину.
svn rm
використовуючи висновок №3 в якості аргументівОтже, повна команда:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Список літератури:
awk '{print " --force "$2"@"}'
якщо ваше ім’я файлу містить @
(якщо ви, наприклад, розробник iOS)
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
повинні робити трюк (і починає виглядати некрасиво)
--force
введете в частину xargs?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
кожен файл-r
до xargs
параметрів (не запускати, якщо ні аргументи не наводяться). Крім того, число аргументів має бути обмеженим, а видалення - пакетним, оскільки виклик не вдається з дуже великою кількістю файлів для видалення, наприклад -n 500
. І останнє, але не менш важливе, виконане цитування є неоптимальним для файлів, що містять спеціальні оболонки типу $
- краще використовувати \n
як роздільник і залишити цитування xargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Я щойно знайшов це, що і робить трюк, видаліть усі "відсутні" файли з робочої копії SVN :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
Дякую Полу Мартіну за версію 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
del missing.list 2>NUL
, тому що я додав усі нові файли безпосередньо після першого видалення видалених файлів, щоб він додався missing.list
до svn: svn delete "missing.list"
працював для мене
Мені подобається варіант PowerShell ... Але ось ще один варіант, якщо ви використовуєте пакетні сценарії Windows:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
Цей скрипт оболонки рекурсивно вивчає ( 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
Невелика модифікація командного рядка, який працює на 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
Насправді можливо повністю видалити користувача missing.list
user3689460 та Paul Martin
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Маючи справу з великою кількістю файлів, може статися так, що введення аргументу до 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