2013-04-08 31 views
7

我正在簽出一個SVN倉庫,包括外部(svn:externals屬性)。只有完全遞歸結帳包括外部

但是,顯然,如果我使用「深度」以外的任何值--depth,則不會下載外部程序。這特別具有諷刺意味,因爲顯然可以稍後使用--set-depth-exclude排除和稍後排除文件夾進行更新。

是否可以有選擇地退房包括所有外部?

+0

你正在使用什麼'--depth'設置?有四個我知道的:_none_,_files_,_immediates_和_infinity_。除了最後一個,沒有一個會檢出一個子目錄樹,更不用說'svn:externals'鏈接了。你到底在期待什麼?我可以使用'svn co --set-depth = infinity'來檢查外部,但這就像更新一個目錄。 – 2013-04-08 14:38:36

+1

示例:svn co --depth立即數 預期:創建根目錄中的所有文件,併爲根目錄中的每個目錄創建一個空目錄。 實際:創建根目錄中的所有文件,併爲根目錄中的每個目錄_except externals_創建一個空目錄。 – user377486 2013-04-09 07:35:38

回答

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 

但顯然,這打破了外部的全部目的。

這種行爲被報道在Subversion問題跟蹤作爲Issue 3311,其中有人指出

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

(但是,這個問題並沒有關閉,仍然有狀態:新

而且我找不到這個「功能」的任何明確的理由,我發現只有the commit which introduced it交換檢查舊--non-recursive選項與檢查depth == svn_depth_infinity,這是有點太嚴格,我會說,但它已基本上停留在t從此以後。

+0

這個建議不好。如果完全遞歸,外部設置正確,如果我'svn更新',那麼外部也會被更新。如果我按照這裏所建議的那樣進行稀疏結帳並手動結賬外部資源,則'svn update'不適用於手動檢出外部資源。 SVN是處理外部事務的主要POS,非常令人沮喪。 – Pavel 2014-03-08 00:25:55

+0

嗯,當然_這不好。正如我所說:除了一個(醜陋的,半工作的,「這破壞了外部的全部目的」),我在這種情況下使用的解決方法,以及功能不在那裏的解釋,我沒有真正的答案。現在。 – Mormegil 2014-03-15 11:00:31

-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的目的是爲了讓你做稀疏檢出,讓您操作你的資料庫結構,而不必檢出文件千兆字節你真的不感興趣的內容。

下面是使用稀疏檢出的兩個例子:

  • 作爲一名CM,我幾乎在所有的項目中都曾有過這樣或那樣的工作。在我的系統上,我做了一個svn co --depth=immediates $REPO/trunk,它允許我在trunk中查看我們所有的項目,但它並不佔用大量的磁盤空間,並且不需要很長時間就可以結帳。然後,我可以進入需要我關注的項目,並執行svn up --set-depth=infinity以獲得該項目。讓整個存儲庫像這樣被檢出允許我操縱我們的項目(重命名它們,刪除過時的項目等)。

  • 在我上一份工作中,我重構了CVS之後我們的分支和標籤到SVN的轉換。成千上萬的分支和標籤是絕對沒有意義的。我做了一個svn co --set-depth=empty $REPO,然後`svn up --set-depth = immediates branches tags。現在我有一個我們所有標籤和分支的目錄,但是它們下面沒有任何文件。我可以刪除過時的分支和標籤,並將其重命名爲更有意義的名稱。

什麼你抱怨的是,如果我做了svn checkout --depth=immediates,我沒有得到一個的外部目錄。但該目錄實際上並不存在於您的項目中。這只是Subversion執行的一個魔術。什麼是使用空的外部目錄?

作爲一名CM,我是少數做稀疏結賬的人之一。這不是大多數開發人員通常所做的事情。當我做一個稀疏的結帳時,我真的不想看到外部目錄。如果由於某種原因,您需要知道外部目錄存在的位置,您可以執行svn plist -vR svn:externals .並獲取完整列表,然後執行svn up --set-depth=infinity $extern_dir

+1

_你抱怨的是[...]我沒有得到一個空的外部目錄。 [...]什麼是使用空的外部目錄?_使用將是更新的能力,並且只需要更新其餘的。更重要的是,無需首先檢查其餘部分。 最終目標是做一個與外部結算稀疏。但是,從答案來看,SVN不支持該模式:您使用外部結算完成結算,或者執行總是排除所有外部結算的稀疏結算。那真的是嗎? – user377486 2013-04-10 08:49:40

+1

我試過這個:在svn co --depth = immediate後,我改變了dir,輸入了svn propget svn:externals以獲得外部URL和本地映射列表,然後嘗試了svn --set-depth = infinity <其中一個本地映射「。沒有下載。然後嘗試--set-depth = infinity <外部URL之一>。錯誤:<外部URL之一>不是本地路徑。使用svn 1.7.9命令行包含在TortoiseSVN – user377486 2013-04-10 08:57:57

2

我遇到同樣的問題,我沒有解決方案,但我認爲我至少已經找到了部分解決方法。

首先我想談談David W關於爲什麼這是一個問題的問題。 我明白他來自哪裏,認爲如果你正在挑選你想要結賬的特定目錄,你可能會認爲你不希望任何其他目錄被檢出,而不是外部。

然而,情況並非總是如此。例如,我們有多個與第三方軟件包相關的開發項目。我們有一個目錄,其中有一個外部目錄鏈接到第三方產品存儲庫,然後與該目錄處於同一級別,我們爲與該第三方項目相關的不同項目開發了不同的目錄。在任何時候,我可能只想在我們的一個項目上工作,並且我不想查看其他十幾個項目,但是我們所有的項目都有相對路徑引用「返回」到第三方項目目錄。因此,無論何時我結賬我們的一個項目,我都希望確保與第三方項目的外部鏈接也被檢出。

這是我們店裏的場景,我們需要稀疏結帳,但我們希望任何連接到稀疏結賬鏈中任何目錄的外部賬戶都被檢出。現在

,爲部分解決辦法....

但是我發現了,我用後TortoiseSVN的做初步疏退房,(這並不讓我的外部),如果我然後去命令提示符並執行下列操作,同時在外部屬性所關聯目錄的上方目錄中執行以下操作(不確定是否該事實是相關的,但認爲值得一提,因爲其他人說他們沒有使用svn up得到類似的結果):

svn up --depth infinity 

它會檢查我的外部(請注意,它沒有拉下我沒有選擇的任何目錄當我選擇我的稀疏結帳開始)。所以這讓我想到了我想去的地方。

這是「更好」,但絕對不是完美的。

0

作爲解決方法,我使用了一些cmd/bat windows shell腳本來讀取外部定義並創建缺少的結帳。這有點像@ 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給出:externals屬性的格式如下:

^/elsewhere/[email protected] myExternalName 

我不得不加在我的腳本這些^^解決的事實,^是Windows cmd中的轉義字符。在SVN外部,它意味着「同一個存儲庫的根」。

在我的使用案例中,我也必須簽出某些外部,而不是其他人,這就是爲什麼我尋找一個特定的外部。當然,您可以循環遍歷外部的所有行,併爲其中的所有行創建稀疏檢出。