Список всех svn: externals рекурсивно?

94

Как я могу получить список всех svn: externals (рекурсивно) в каталоге? Есть ли для этого какая-нибудь полезность?

(Я использую винду (и черепаху))

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

Нильс Босма
источник
Этот вопрос также присутствует на stackoverflow.com/questions/5118320/…
Тьяго Бургос

Ответы:

147

Сделайте следующее в корне вашей рабочей копии:

svn propget svn:externals -R

Как обсуждается в комментариях ниже, здесь не перечисляются внешние элементы.

Примечание для пользователей TortoiseSVN: в установщике TortoiseSVN есть опция, позволяющая также установить клиент командной строки SVN. По умолчанию этот параметр отключен.

Вим Коенен
источник
это просто дает мне список всех внешних элементов и их местонахождение ... но не 'расположение' внешнего ... т.е. если у меня lib \ my_ex как внешний, я получаю только my_ex http: / svnlinkhere
ShoeLace
4
@ShoeLace: вы должны работать со старым SVN, потому что в 1.6.1 вывод действительно содержит эту информацию.
Wim Coenen
1
Извините, но я должен проголосовать против, так как а) это не приведет к выводам всех внешних данных; fx, если у нас есть external по отношению к папке и где-то внутри этой папки есть внешний - это не будет отображаться б) вопрос помечен как черепаха svn, но ответ связан с клиентом командной строки
pmod
2
@pmod: а) Я этого не знал, но мне кажется, что это ошибка SVN, а не ошибка с моей стороны. б) Программа установки TortoiseSVN 1.7 включает клиент командной строки!
Вим Коенен
1
Рекурсивность относится к структуре папок рабочей копии, в которой вы вызываете команду. Это не относится к внешним элементам, вложенным внутрь внешних. Так что я не думаю, что это ошибка. В противном случае это сделало бы операцию еще более непригодной с точки зрения продолжительности.
Фрэнк
15

Изменение всех этих внешних свойств вручную звучит утомительно. Вы смотрели на новую функциональность внешних элементов, добавленную в Subversion 1.5?

Subversion 1.5 делает огромный шаг в избавлении от этих разочарований. Как упоминалось ранее, URL-адреса, используемые в новом формате определения внешних элементов, могут быть относительными, а Subversion предоставляет синтаксическую магию для определения нескольких разновидностей относительности URL-адресов.

../

    Относительно URL-адреса каталога, в котором установлено свойство svn: externals

^ /

    Относительно корня репозитория, в котором версируется свойство svn: externals

//

    Относительно схемы URL-адреса каталога, в котором установлено свойство svn: externals

/

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

Может, один из них поможет? Я думаю, это зависит от того, как именно вы выполняете ветвление и как выглядит структура вашего репозитория.

Себастьян Селис
источник
9

Мой способ обхода TortoiseSVN:

Откройте диалоговое окно «Ветвь / тег ...» из контекстного меню SVN. В нижнем диалоговом окне показаны все внешние элементы, включая вложенные внешние.

DrRobotNinja
источник
Похоже, 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
}

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я знаю, что исходный вопрос касался окон, и сценарий оболочки не будет работать там, если вы не используете 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
}
paulie4
источник