Список всех svn: externals рекурсивно? - PullRequest
88 голосов
/ 25 марта 2009

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

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

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

Ответы [ 6 ]

133 голосов
/ 25 марта 2009

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

svn propget svn:externals -R

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

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

15 голосов
/ 25 марта 2009

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

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

.. /

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

^ /

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

//

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

/

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

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

8 голосов
/ 15 сентября 2016

Мой обходной путь для TortoiseSVN:

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

0 голосов
/ 16 июня 2017

Я взял Ответ Даниэля Алдера , удалил вызовы 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
}
0 голосов
/ 13 мая 2015

Я использовал ответ Вима Коенена и написал следующий скрипт для создания списка всех ревизий:

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 голосов
/ 18 августа 2014

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

...