Список всех 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
}