Список усіх svn: зовнішніх рекурсивно?


94

Як я можу отримати список усіх svn: externals (рекурсивно) в каталозі? Чи є для цього утиліта?

(Я використовую Windows (і черепаху))

У мене є купа svn: externals, що посилаються на різні загальні частини мого проекту, і я, коли я розгалужуюсь, зазвичай досить схильний до помилок, щоб знайти всі зовнішні і змінив їх так, що посилання на шляхи в новій гілці.


Це питання також присутнє на stackoverflow.com/questions/5118320/…
Тьяго Бургос 02

Відповіді:


144

Виконайте наступне в корені вашої робочої копії:

svn propget svn:externals -R

Як обговорювалося в коментарях нижче, це не перелічує зовнішніх у зовнішніх.

Примітка для користувачів TortoiseSVN: у програмі встановлення TortoiseSVN є можливість також встановити клієнт командного рядка SVN. Цей параметр не ввімкнено за замовчуванням.


це просто дає мені список усіх зовнішніх і куди вони вказують .. але не "розташування" зовнішнього .. тобто якщо у мене є lib \ my_ex як зовнішній, я отримую лише my_ex http: / svnlinkhere
ShoeLace

4
@ShoeLace: ви повинні працювати з більш старої SVN , тому що в 1.6.1 вихід робить містити цю інформацію.
Вім Коен

1
Вибачте, але я повинен проголосувати проти, оскільки а) це не буде відображати всі зовнішні; fx, якщо у нас є зовнішній до папки і десь всередині цієї папки є зовнішній - це не відображатиметься b) питання позначене черепахою svn, але відповідь пов'язана з клієнтом командного рядка
pmod

2
@pmod: а) Я цього не знав, але мені здається, це помилка SVN, а не помилка з мого боку. б) Інсталятор TortoiseSVN 1.7 включає клієнт командного рядка!
Вім Коен

1
Рекурсивність стосується структури папок робочої копії, де ви викликаєте команду. Це не стосується зовнішніх, вкладених всередину зовнішніх. Тому я не думаю, що це помилка. В іншому випадку це зробило б операцію ще більш непридатною з точки зору тривалості.
Frank Rem

15

Зміна всіх цих зовнішніх властивостей вручну звучить нудно. Ви розглядали нову функціональність для зовнішніх програм, додану в Subversion 1.5?

Subversion 1.5 робить величезний крок для усунення цих розчарувань. Як вже згадувалося раніше, URL-адреси, що використовуються у новому форматі визначення зовнішніх даних, можуть бути відносними, а Subversion забезпечує синтаксичну магію для вказівки кількох ароматів відносності URL-адрес.

../

    Відносно URL-адреси каталогу, для якого встановлено властивість svn: externals

^ /

    Відносно кореня сховища, у якому властивість svn: externals має версії

//

    Відносно схеми URL-адреси каталогу, для якого встановлено властивість svn: externals

/

    Порівняно з кореневою URL-адресою сервера, на якому влаштовано властивість svn: externals

Може, хтось із тих допоможе? Я думаю, це залежить від того, як саме ви розгалужуєтесь та як виглядає ваша структура сховища.


8

Моє рішення для TortoiseSVN:

Відкрийте діалогове вікно "Відділення / тег ..." у контекстному меню SVN. У нижньому діалоговому вікні показано всі зовнішні, включаючи вкладені зовнішні.


Схоже, TortoiseSVN не рекурсивно шукає svn: externals всередині svn: externals, тому це те саме, що робити svn propget svn:externals -R.
paulie4

0

Можливо, в якості обхідного шляху ви можете структурувати свій проект таким чином, щоб усі зовнішні елементи були встановлені в одній папці, наприклад, у папці проекту трохи нижче Trunk. (Це не означає, що всі зовнішні папки, до речі, мають бути на однаковій глибині.) Тоді ви можете клацнути правою кнопкою миші папку вашого проекту, потім Властивості ..., потім вкладку Subversion, потім Властивості ... потім двічі клацніть svn: externals.


0

Я використав відповідь Віма Коенена і написав наступний сценарій, щоб створити список усіх версій:

getSvnRevs() {
  cd "$1"
  wcver="$(svnversion)"
  [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
  echo "$1: $wcver"
  svn propget svn:externals -R | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      wcdir="$wcparent/$c"
      [ -z "$e" ] || panic "Invalid format #1"
    else
      [ -n "$wcparent" ] || panic "Invalid format #2"
      wcdir="$wcparent/$a"
      [ -z "$c" ] || panic "Invalid format #3"
    fi
    [ -d "$wcdir" ] || panic "Invalid directory: $wcdir"
    wcver="$(svnversion "$wcdir")"
    [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
    echo "$1/$wcdir: $wcver"
  done
}

На щастя, у мене немає вкладених зовнішніх елементів, тому мені не довелося тестувати це, і, мабуть, це не спрацює. Але якщо вам це потрібно, можливо, досить просто викликати цю функцію рекурсивно. Крім того, я ніколи не тестував з іменами файлів, які потребують екранування. Тоді це, швидше за все, не спрацює.

ЗАМОВЛЕННЯ: Я знаю, що початкове питання стосувалося Windows, і скрипт оболонки там не працюватиме, якщо ви не використовуєте cygwin або подібний.


0

Я взяв відповідь Даніеля Альдера , видалив дзвінки svnversion і зробив її рекурсивною (ПРИМІТКА: read a b c d eне працює, якщо в джерелі чи місці призначення є пробіл). Це скрипт bash, тому вам або знадобиться щось на зразок Cygwin, або використовувати підсистему Windows для Linux .

getSvnExternals() {
  svnbase="$1"
  svnpath="$2"
  svn propget svn:externals -R "$svnbase/$svnpath" 2> /dev/null | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      external="$c"
      wcdir=$(echo "$wcparent/$d" | sed s#^./##)
      [ -z "$e" ] || echo "WARNING: Invalid format #1. line='$a $b $c $d $e'"
    else
      [ -n "$wcparent" ] || echo "WARNING: Invalid format #2. wcparent=$wcparent"
      external="$a"
      wcdir=$(echo "$wcparent/$b" | sed s#^./##)
      [ -z "$c" ] || echo "WARNING: Invalid format #3. line='$a $b $c $d $e'"
    fi
    echo "$1/$wcdir: $external"
    ## recurse into external directory
    [ -d "$wcdir" ] && getSvnExternals "$1/$wcdir"
  done
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.