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


94

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

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

私はプロジェクトのさまざまな共有部分にリンクしているsvn:externalsの束を持っています。分岐すると、通常、すべての外部を見つけて変更し、新しい分岐内のパスへのリンクにリンクするように変更します。


回答:


144

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

svn propget svn:externals -R

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

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


/ svnlinkhere:私は、外部IのみGET my_ex HTTPとしてのlib \ my_exを持っている場合、それはちょうど、外部..すなわちの「場所」を私にすべての外部のリストを与えると、どこがポイント..しかしない
靴紐

4
@ShoeLace:1.6.1では出力にこの情報含まれるため、古いSVNを使用している必要があります。
Wim Coenen

1
申し訳ありませんが、私は)これは出力されませんので、ダウン票、それに持っているすべての外部。fx、フォルダの外部にあり、このフォルダ内のどこかに外部がある場合-これは表示されませんb)質問には亀のsvnのタグが付けられていますが、回答はコマンドラインクライアントに関連しています
pmod

2
@pmod:a)私はそれを知りませんでしたが、私の側のエラーというよりは、SVNのバグのようです。b)TortoiseSVN 1.7インストーラーはコマンドラインクライアントが含まれています!
Wim Coenen、2011

1
再帰性は、コマンドを呼び出す作業コピーのフォルダー構造に関連しています。これは、外部にネストされた外部に関するものではありません。バグだとは思いません。それ以外の場合は、これにより操作が継続時間の点でさらに使用できなくなります。
フランクレム

15

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

Subversion 1.5は、これらの不満を解消するために大きな一歩を踏み出しました。前述のように、新しい外部定義形式で使用されるURLは相対である可能性があり、SubversionはURL相対性の複数のフレーバーを指定するための構文マジックを提供します。

../

    svn:externalsプロパティが設定されているディレクトリのURLからの相対

^ /

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

//

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

/

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

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


8

TortoiseSVNの私の回避策:

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


TortoiseSVNはsvn:externals内でsvn:externalsを再帰的に検索しないようで、これはと同じsvn propget svn:externals -Rです。
paulie4

0

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


0

私は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
}

幸い、私は外部を入れ子にしていないので、これをテストする必要はなく、うまくいかないと思います。しかし、これが必要な場合は、この関数を再帰的に呼び出すだけで十分でしょう。また、エスケープが必要なファイル名でテストしたことはありません。その場合、おそらく機能しません。

免責事項:私は元の質問がWindowsに関するものであることを知っており、cygwinなどを使用していない限り、シェルスクリプトはそこで機能しません。


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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.