2009-03-25 4 views
80

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

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

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

+0

Этот вопрос также присутствует в http://stackoverflow.com/questions/5118320/find-paths-with-svnexternal-properties-with-certain-string –

ответ

125

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

svn propget svn:externals -R 

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

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

+0

что просто дает мне список из всех внешних и где они указывают .. но не «местоположение» внешнего ... ie, если у меня есть lib \ my_ex как внешний я получаю только my_ex http:/svnlinkhere – ShoeLace

+3

@ShoeLace: вы должны быть работая с более старым SVN, потому что в 1.6.1 вывод * * содержит эту информацию. –

+0

Хороший ответ ... но как я могу это сделать в Windows с TortoiseSVN? - У меня нет «svn.exe» на моем компьютере, но у меня установлен TortoiseSVN. – Eddified

15

Ручное изменение всех этих внешних свойств звучит утомительно. Вы посмотрели new functionality for externals, добавленный в Subversion 1.5?

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

../

      Относительно URL каталога, на котором SVN: свойство установлено внешнее

^/

      По отношению к репозиторию в котором свойство svn: externals имеет версию

//

      Относительно схему URL каталога, на котором SVN: свойство внешнего устанавливаются

/

      По отношению к корневому URL сервера, на котором SVN: внешняя собственность версия

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

0

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

0

Я использовал ответ Wim Coenen и написал следующий сценарий, чтобы создать список всех изменений:

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 или аналогичный.

7

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

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

+0

Похоже, что TortoiseSVN не рекурсивно ищет svn: externals внутри svn: externals, так что это то же самое, что и svn propget svn: externals -R'. – paulie4

0

Я принял Daniel Alder's answer, удалил вызовы svnversion и сделал его рекурсивным (ПРИМЕЧАНИЕ: read a b c d e не работает, если есть место либо в источнике, либо в пункте назначения). Это сценарий bash, поэтому вам понадобится что-то вроде Cygwin или используйте Windows Subsystem for 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 
} 
Смежные вопросы