2013-04-08 37 views
7

外部(svn:externalsプロパティ)を含むSVNリポジトリをチェックアウトしています。完全に再帰的なチェックアウトには外部が含まれています

しかし、明らかに--depthを '無限大'以外の値で使用すると、外観はダウンロードされません。明らかに後で-set-depthで除外してフォルダを除外して後で更新することが可能なので、これは特に皮肉なことです。

にすべての外観が含まれていますか?

+0

どの '--depth'設定を使用していますか?私が知っているのは、_none_、_files_、_immediates_、_infinity_の4つです。最後のものを除いて、これらのどれも 'svn:externals'リンクだけでなく、サブディレクトリツリーをチェックアウトしません。正確に何を期待していますか?私は 'svn co -set-depth = infinity'を外部の_checkout_に使うことができますが、これはディレクトリを更新するのと同じです。 –

+1

例:svn co -depth immediates 期待される:ルートディレクトリ内のすべてのファイルが作成され、ルートディレクトリ内の各ディレクトリに対して空のディレクトリが作成されます。 実際:ルートディレクトリ内のすべてのファイルが作成され、ルートディレクトリ_externals_以外の各ディレクトリに対して、空のディレクトリが作成されます。 – user377486

答えて

4

私は同じ問題を抱えていますが、後で手作業でチェックアウトする回避策以外は実際の答えはありません。

mkdir wc 
svn co http://example.com/svn/repo/trunk wc --depth=immediates 
cd wc 
svn co http://example.com/svn/extrepo external --depth=empty 

しかし明らかに、これは外観の全体的な目的を破っています。

この動作は、それが

This was an explicitly defined feature. (There is code to check for this condition and then explicitly skip handling)

を指摘されたIssue 3311、とSubversionの問題追跡で報告された(ただし、問題は閉じられませんでしたし、今でもステータスがあります。NEW)を

そして、私はこの "機能"の明白な理由を見つけることができませんでした。私はdepth == svn_depth_infinityのチェックで古い--non-recursiveのチェックをスワップすることによってのみthe commit which introduced itを見つけました。これはちょっと厳しいですが、それ以来ここに。

+0

に含まれているsvn 1.7.9コマンドラインを使用すると、この提案は良くありません。もし完全に再帰的であれば、外部は適切に設定されています。もし 'svn update'なら外部も更新されます。ここで示唆しているように、私がスパースチェックアウトと手動チェックアウトの外部を行うと、手動でチェックアウトされた外部に対して 'svn update 'は機能しません。 SVNは外見を扱う上で大変なPOSなので、とてもイライラします。 – Pavel

+0

もちろん、_これはうまくいきません。私が言っているように、私は実際の答えはありません。(醜い、半分の作業、「これは外部の目的を全滅させます」)私がそのような場合に使用する回避策とその機能はちょうどそこにないという説明今。 – Mormegil

-1

Example: svn co --depth immediates Expected: all files in the root directory are created, and for each directory in the root directory, an empty directory is created. Actual: all files in the root directory are created, and for each directory in the root directory except the externals , an empty directory is created.

私はあなたの問題を理解していると思いますが、これがどのように問題であるかわかりません。 svn co --depthsvn update --set-depthの目的は、あなたがあなたが本当にに興味がないなら、ファイルのチェックアウトギガバイトにせずにリポジトリの構造を操作することを可能にするスパースチェックアウトを行うことを可能にすることである。

ここでスパースチェックアウトを使用しての2つの例があります:

  • CMとして、私はほとんどすべてのプロジェクトで一度に作業します。私のシステムでは、私はsvn co --depth=immediates $REPO/trunkを実行しました。これは、すべてのプロジェクトをトランクで見ることができますが、多くのディスクスペースを使用せず、チェックアウトに時間がかかりませんでした。私はその後、私の注意を必要とするプロジェクトに入り、そのプロジェクトを手に入れるためにsvn up --set-depth=infinityを行います。このようにリポジトリ全体をチェックアウトすると、プロジェクトの操作(名前の変更、廃止されたものの削除など)が可能になります。

  • 私の最後の仕事では、CVSからSVNへの変換の後で私たちのブランチとタグをリファクタリングしました。何千ものブランチとタグが作成されましたが、それはまったく無意味でした。 svn co --set-depth=empty $REPOを実行し、 `svn up -set-depth = immediatesブランチタグを作成しました。今私はすべてのタグとブランチのディレクトリを持っていましたが、その下のファイルはありませんでした。廃止されたブランチとタグを削除し、それらをより意味のある名前に変更することができました。あなたが不満している何

は私がsvn checkout --depth=immediatesをすれば、私は外観のディレクトリを取得していないということです。しかし、そのディレクトリは実際にあなたのプロジェクトには存在しません。これは単にSubversionによって実行される魔法のトリックです。何が空の外部ディレクトリの使用ですか?

CMとして、私はスパースチェックアウトを行う少数の人々の1人です。これは、ほとんどの開発者が通常行うことではありません。私がスパースチェックアウトをするとき、私は実際に外部ディレクトリを見たくありません。なんらかの理由で外部ディレクトリが存在する場所を知る必要がある場合は、svn plist -vR svn:externals .を実行して完全なリストを取得してからsvn up --set-depth=infinity $extern_dirを実行します。

+1

_あなたが不平を言っているのは、[...]私は空の外部ディレクトリを取得しません。 [...]空の外部ディレクトリの使用は何でしょうか?_それを更新する機能と、残りのものを更新する必要がない場合のみです。さらに、最初の場所で残りをチェックアウトする必要はありません。 最終的な目標は、外部からスパースチェックアウトを行うことです。しかし、答えから判断すると、SVNはそのモデルをサポートしていません。あなたは外部から完全なチェックアウトを行うか、常にすべての外部を除外する疎なチェックアウトを行います。本当にそうですか? – user377486

+1

私はこれを試しました:svn co --depth = immediateの後に、私はdirを変更し、svn propget svn:externalsをタイプして外部URLとローカルマッピングのリストを取得してからsvn upを試しました--set-depth = infinity <ローカルマッピング>。何もダウンロードされませんでした。次に、 - set-depth = infinity <外部URLの1つ>を試しました。エラー:<外部URLの1つ>はローカルパスではありません。 TortoiseSVN – user377486

2

同じ問題が発生していますが解決策はありませんが、少なくとも部分的な回避策が見つかったと思います。

まず、なぜこれが問題なのかについてDavid Wの質問にお答えしたいと思います。 私は、あなたがチェックアウトしたい特定のディレクトリを選んでいる場合、他のディレクトリが外部、外部をチェックアウトされていないと思っているかもしれないと考えるかもしれません。

ただし、必ずしもそうではありません。たとえば、サードパーティのパッケージに関連する複数の開発プロジェクトがあります。私たちには、サードパーティ製の製品リポジトリにリンクしている1つの外部ディレクトリがあり、そのディレクトリと同じレベルにあるディレクトリがあります。私はいつでも私たちのプロジェクトの一つに取り組んでみたいと思うかもしれません。私は他のプロジェクトもチェックしたくありませんが、私たちのプロジェクトはすべて、第三者のプロジェクトディレクトリへの相対パス参照を持っています。だから、いつでも私のプロジェクトをチェックアウトして、私は第三者プロジェクトへの外部リンクもチェックアウトされていることを確認したいと思います。

スパースチェックアウトが必要な私たちのシナリオですが、スパースチェックアウトチェーン内のいずれかのディレクトリに添付されている外部もチェックアウトされるようにしたいと考えています。私は、その後に行けば(私の外観を得ることはありません)初期まばらなチェックアウトを行うためのTortoiseSVNを使用した後、私は、何だった部分的な回避策のために今

、....

コマンドプロンプトを開き、外部プロパティーが関連付けられているディレクトリーの上にあるディレクトリーの中で次のコマンドを実行します(その事実が関係していますが、svnを使用して類似の結果を得られなかったと言われていたので言及する価値があると考えました)。

svn up --depth infinity 

私の外見をチェックします(私が選択しなかったディレクトリはプルダウンしません私が最初にスパースチェックアウトを選んだとき)。だから、これは私が欲しかったところに私をもたらしました。

これは「BETTER」ですが、まだ完全ではありません。

0

回避策として、私は外部定義を読んで欠落したチェックアウトを作成するためにcmd/batウィンドウシェルスクリプトを少し使用しました。 @Mormegilの答えは、ハードコーディングするのではなく外部のURLを読むという点を除けば、ちょっとしたことです。

cd folderWithExternal 

rem Read line from svn:external and put it in temporary file 
svn propget svn:externals | findstr myExternalName > external.tmp 

rem Put content of temporary file in variable 
set /p external=<external.tmp 

rem Create a checkout for the external. The ^^ is to deal with cmd escaping. 
svn checkout ^^%external% 

この例では、外部定義がSVNに与えられていることを前提としています。この形式の外観プロパティを:

^/elsewhere/[email protected] myExternalName 

私は^であるという事実を回避するために私のスクリプトでこれらの^^を追加する必要がありましたWindowsのエスケープ文字cmd。 SVN外部では、 "同じリポジトリのルート"を意味します。

私の使用例では、特定の外部をチェックアウトする必要がありましたが、他のものはチェックアウトしていなかったので、特定の外部を探すのです。もちろん、外部のすべての行をループして、すべての行をスパースチェックアウトで作成することもできます。

関連する問題