Краткая командная строка для копии (ветки)
Все примеры ветвления svn, которые я видел до сих пор, выглядят так
svn cp -m 'Making test branch' svn://svnrepo/hellosite svn://svnrepo/hellosite2
Итак, для того, чтобы разветвляться, мне нужно каждый раз указывать полный URL-адрес удаленного хранилища. Но:
- Рабочая копия связана с одним удаленным репозиторием. Даже svn-переключатель считается передовой "хирургической" операцией.
- Ветвление удаленных URL-адресов в том же хранилище, что и рабочая копия, всегда имеет значение (по крайней мере, мне никогда не приходилось входить в репозиторий, полностью не связанный с текущим).
- Копирование между репозиториями не поддерживается (правильно?).
- Информация о удаленном репозитории доступна: см. информацию о svn.
Итак, почему в мире я должен каждый раз вводить полный URL?!! Или мне что-то не хватает?
Есть ли ярлык, который позволяет ссылаться на текущий удаленный репозиторий? Что-то вроде
svn cp -m 'Making test branch' //hellosite //hellosite2
Ответы
Ответ 1
Используя SVN 1.6 или более позднюю версию, если вы в это время работаете с рабочей копией, вы можете использовать нотацию каретки как короткое сокращение к корню репозитория, например
svn cp -m 'Making test branch' ^/trunk ^/branches/hellosite
Обратите внимание, что в Windows по крайней мере вам нужно окружить ^/trunk
в двойных кавычках, чтобы получить его через оболочку.
svn cp -m "Making test branch" "^/trunk" "^/branches/hellosite"
Ответ 2
Вы можете просто добавить псевдоним в свою оболочку. См. Этот этот SO post, например.
Ответ 3
Я создал небольшой файл псевдонимов bash для удобного ветвления svn в оболочке. (Вы можете получить полный файл здесь: https://github.com/grexi/snippets/blob/master/svnaliases)
function getrepo {
REPO=`LANG=C svn info | grep "Repository Root"`
echo ${REPO:17}
}
function getrepobase {
if [ "`LANG=C svn info | grep -c Relative`" -gt 0 ];
then
parent=".."
grandparent=".."
if [ -d ".svn" ]; then
echo ""
else
while [ ! -d "$grandparent/.svn" ]; do
parent=$grandparent
grandparent="$parent/.."
done
echo $grandparent
fi
else
parent=""
grandparent="."
while [ -d "$grandparent/.svn" ]; do
parent=$grandparent
grandparent="$parent/.."
done
echo $parent
fi
}
function _svnbr {
if [ $# != 2 ]; then
echo "Usage: $0 branchname \"commit message\""
else
REPO=$(getrepo)
if [ -z "$REPO" ]; then
echo "You are not inside a svn working copy"
return;
fi
svn copy $REPO/trunk $REPO/branches/$1 -m "$2"
svn switch $REPO/branches/$1 $(getrepobase)
fi
}
alias svnbr=_svnbr
Создание ветки теперь превращается в
svnbr "branchname" "commit message"
внутри рабочего каталога.
Ответ 4
Это один из многих странных SVN-измов, к которым вам нужно привыкнуть.
Ваше предположение, что вам нужно указать полный URL-адрес в обоих аргументах, является абсолютно правильным.