Подтвердить что ты не робот

Краткая командная строка для копии (ветки)

Все примеры ветвления 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

4b9b3361

Ответ 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-адрес в обоих аргументах, является абсолютно правильным.