web-dev-qa-db-ja.com

Subversionコピー(ブランチ)の簡潔なコマンドライン

私がこれまでに見たsvnブランチのすべての例は次のようになりますsvn cp -m 'Making test branch' svn://svnrepo/hellosite svn://svnrepo/hellosite2

したがって、分岐するには、毎回リモートリポジトリの完全なURLを指定する必要があります。だが:

  • 作業コピーは、単一のリモートリポジトリに関連付けられています。 svnスイッチでさえ高度な「外科的」操作と見なされます。
  • 作業コピーと同じリポジトリ内のリモートURLの分岐は常に当てはまります(少なくとも、現在のリポジトリとはまったく関係のないリポジトリで分岐する必要はありませんでした)。
  • リポジトリ間のコピーはサポートされていません(右?)。
  • リモートリポジトリに関する情報が利用可能です:svninfoを参照してください。

では、なぜ世界で毎回完全なURLを入力する必要があるのでしょうか。それとも私は何かが恋しいですか?現在のリモートリポジトリを参照できるショートカットはありますか?何かのようなもの svn cp -m 'Making test branch' //hellosite //hellosite2

26
Petr Gladkikh

SVN 1.6以降を使用して、その時点で作業コピー内にいる場合は、リポジトリルートへのショートカットとして キャレット記法 を使用できます。

svn cp -m 'Making test branch' ^/trunk ^/branches/hellosite

Windowsでは、少なくとも^/trunkを二重引用符で囲んで、シェルを通過させる必要があることに注意してください。

svn cp -m "Making test branch" "^/trunk" "^/branches/hellosite"
44
Rup

シェルにエイリアスを追加するだけです。これを参照してください this SO post たとえば。

3
CharlesB

シェルでのsvnブランチに便利な小さなbashエイリアスファイルを作成しました。 (完全なファイルはここで入手できます: 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"

作業ディレクトリ内。

2
Gregor