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

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

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

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

Ответ 1

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

svn propget svn:externals -R

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

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

Ответ 2

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

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

../

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

^/

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

//

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

/

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

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

Ответ 3

Мое обходное решение для TortoiseSVN:

Откройте диалоговое окно "Branch/tag..." из контекстного меню SVN. В нижнем диалоговом окне отображаются все внешние элементы, включая вложенные внешние.

Ответ 4

Возможно, в качестве обходного пути вы можете структурировать свой проект таким образом, чтобы все внешние элементы были установлены в одной папке, например, в папке проекта чуть ниже Trunk. (Это не означает, что все внешние папки должны быть на одной и той же глубине кстати.) Затем вы можете щелкнуть правой кнопкой мыши по папке проекта, затем Properties..., затем вкладку Subversion, затем Properties... then дважды щелкните svn: externals.

Ответ 5

Я использовал ответ Вима Коэнена и написал следующий script, чтобы создать список всех ревизий:

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
}

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я знаю, что исходный вопрос касался окон, а оболочка script не будет работать там, если вы не используете cygwin или подобное.

Ответ 6

Я принял ответ Даниэля Алдера, удалил вызовы svnversion и сделал его рекурсивным (ПРИМЕЧАНИЕ: read a b c d e не работает, если в источнике есть место или пункт назначения). Это bash script, поэтому вам понадобится что-то вроде 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
}