web-dev-qa-db-ja.com

すべてのsvn:externalsを再帰的にリストしますか?

ディレクトリ内のすべてのsvn:externalsのリストを(再帰的に)取得するにはどうすればよいですか?このためのユーティリティはありますか?

(私はWindows(および亀)を使用しています)

私のプロジェクトのさまざまな共有部分にリンクするsvn:externalsがたくさんあり、ブランチするときは通常、すべての外部を見つけて変更し、新しいブランチ内のパスへのリンクになるように変更する傾向があります。

89
Niels Bosma

作業コピーのルートで以下を実行します。

svn propget svn:externals -R

以下のコメントで説明されているように、これは外部の外部をリストしません。

TortoiseSVNユーザーへの注意:TortoiseSVNインストーラーには、SVNコマンドラインクライアントもインストールするオプションがあります。このオプションはデフォルトでは有効になっていません。

135
Wim Coenen

これらの外部プロパティをすべて手動で変更するのは面倒です。 Subversion 1.5で追加された externalsの新機能 を見ましたか?

Subversion 1.5は、こうしたフラストレーションを解消するために大きな一歩を踏み出しました。前に述べたように、新しい外部定義フォーマットで使用されるURLは相対的である場合があり、SubversionはURL相対性の複数のフレーバーを指定するための構文マジックを提供します。

../

svn:externalsプロパティが設定されているディレクトリのURLに関連

^ /

svn:externalsプロパティがバージョン管理されているリポジトリのルートに関連

//

svn:externalsプロパティが設定されているディレクトリのURLのスキームに関連

/

svn:externalsプロパティがバージョン管理されているサーバーのルートURLからの相対

たぶんそれらのいずれかが役立つでしょうか?私はそれがあなたがどのように分岐しているか、そしてあなたのリポジトリ構造がどのように見えるかに正確に依存すると思います。

15
Sebastian Celis

TortoiseSVNの私の回避策:

SVNコンテキストメニューから[ブランチ/タグ...]ダイアログを開きます。下のダイアログには、ネストされた外部を含むすべての外部が表示されます。

8
DrRobotNinja

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などを使用していない限り、シェルスクリプトはそこで動作しません。

0
Daniel Alder

回避策として、すべてのエクスターナルが同じフォルダー(たとえば、トランクのすぐ下のプロジェクトフォルダー)に設定されるように、プロジェクトを構成することができます。 (これは、すべての外部フォルダーが同じ深さになければならないという意味ではありません。)次に、プロジェクトフォルダーを右クリックし、[プロパティ...]、[Subversion]、[プロパティ...]の順にクリックします。 svn:externalsをダブルクリックします。

0

Daniel Alderの答え を取り、svnversion呼び出しを削除し、再帰的にしました(注:read a b c d eは、ソースまたは宛先のいずれかにスペースがある場合は機能しません)。これはbashスクリプトであるため、Cygwinのようなものが必要になるか、 Linux用Windowsサブシステム を使用します。

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
}
0
paulie4