2012-05-21 27 views
0

我在哪裏工作,我們有一些非常大的存儲庫。我使用Subversion的稀疏目錄功能非常有利。然而,我不知道爲什麼我似乎無法做一個空的(或稀疏的)存儲庫檢出,然後遞歸地「遞增」長路徑的目錄。說,我叫庫「PROJECT1」具有以下佈局:使用一個(或幾個)命令設置長路徑的SVN更新深度

foo/ 
bar/ 
    baz/ 
    brak/ 
    schwing/yadda/etc/i386/package/ 

(。記住,這只是一個例子,真正的回購協議是相當複雜)我希望(因各種原因)有工作目錄佈局鏡像回購,除了我想省略一些像「foo」和「bar/baz」的路徑。所以現在,我做這樣的事情:

svn checkout --depth=empty svn+ssh://svn/project1 project1 
cd project1 
svn update --depth=empty bar 
svn update --depth=empty bar/baz 
svn update --depth=empty bar/baz/schwing 
svn update --depth=empty bar/baz/schwing/yadda 
svn update --depth=empty bar/baz/schwing/yadda/etc 
svn update --depth=empty bar/baz/schwing/yadda/etc/i386 
svn update --depth=infinity bar/baz/schwing/yadda/etc/i386/package 

我是密集的還是沒有更短的方式來做到這一點?我已經檢查過SVN文檔並使用Google搜索。我今天準備喜歡做的是這樣的:

svn checkout --depth=empty svn+ssh://svn/project1 project1 
svn update --depth=infinity bar/baz/schwing/yadda/etc/i386/package 

,使得「打包」所有的家長會自動添加到文件系統(類似於「MKDIR -p」),但不填充除路徑中指定的子項外的任何內容。當我嘗試上面的命令時,SVN甚至沒有給出錯誤,它只是說路徑被「跳過」,檢查工作目錄顯示沒有任何事情發生。

我知道我可以編寫一個shell函數來處理這個(可能會),但它只是覺得應該有一個更好的方法。謝謝你的幫助。

回答

1

Subversion的設計與CVS的工作流程兼容,儘可能簡單易用。稀疏結帳不是一個真正的高需求項目,所以該功能真的沒有工作。在95%的項目中,開發人員希望檢出特定的目錄,就是這樣。

但是,看到你在做什麼,爲什麼不簡單地做到這一點?

$ svn co svn+ssh://svn/project1/bar/baz/schwing/yadda/etc/i386/package project1-package 

您還可以設置URL環境變量在.profile.bashrc文件是這樣的:

PACKAGE_URL=bar/baz/schwing/yadda/etc/i386/package 

,然後使用它們像這樣:

$ svn co $svn+ssh://svn/project1/$PACKAGE_URL project1-package 

這樣,你」重新檢查你正在使用的目錄。

順便說一句,有版本控制系統處理稀疏檢出比Subversion更好。例如,Perforce很擅長它。

當然,隨着力量,你失去了簡單性。爲了從Perforce結帳,您需要創建一個視圖,將您要檢出的內容映射到哪個目錄。你可以用Perforce的映射來做各種各樣的花哨的東西,但是大多數開發人員發現,複雜性所帶來的痛苦並不值得放棄。


響應

正如在問題中提到,我需要工作目錄佈局或多或少鏡倉庫的佈局。 (主要是爲了一些自動化工具的好處。)我知道,可以在回購站中的任意路徑啓動他/她的工作目錄。切換VCS不是一種選擇,我工作的公司在後臺與Subversion結婚(很可能是特定的版本,甚至是)在所有的永久。不過,請欣賞這些建議。 - eil

我提到了Perforce以作比較。我知道你不能徹底切換VCS,但是Subversion真的不會做你想做的事情,這主要是由於Subversion的最初設計。

Subversion被設計爲易於使用並遵循CVS工作流程。 CVS是最流行的版本控制系統,其設計也很簡單。我拋棄了關於​​Perforce的一點,主要強調了這一點。 Perforce可以以沉着的方式做你所要求的,但是以額外的複雜性爲代價,使得Perforce讓許多開發者厭惡。

你提到這與模仿你的構建工具有關,我不確定這意味着什麼。

您的構建工具是否將東西放入超級目錄到您的結帳目錄中?這對於構建工具來說通常是一件壞事。它限制了它們的有效性,並可能導致副作用,因爲構建可能會對用戶的文件和目錄產生不良影響。你可以修改構建不這樣做嗎?

也許你這樣做了,因此可以將二進制文件檢入到構建樹中的其他位置以供其他構建使用。像Jenkins這樣的構建工具有能力copy artifacts from one build job to another。這允許您共享構建工件,而無需首先檢查構建工具的進出。這會解決你的問題嗎?

也可以創建一個工件存儲庫。在Java世界中,Maven和帶有Ivy擴展的Ant都能很好地完成這項工作。甚至還有用於常用第三方Java工件的全球存儲庫網絡,並且很容易添加嚴格限制在您的構建環境中的構件。

在非Java世界中做這件事並不是很難用非Java世界中的相同Java工具來做。我見過一些使用像Artifactory這樣的工具來存儲C++共享對象庫的地方。一個標準的Make文件可以在構建時使用curlwget來獲取所需的構件,並且大多數構建工具將構建的構件發送到Artifactory時沒有問題。

也許你需要package2遲早是兄弟目錄package。在你原來的方案中,你可以上一個目錄然後做一個svn update --set-depth=infinity package2

你就可以用不同的檢出類似的東西:

$ svn co svn+ssh://svn/project1/bar/baz/schwing/yadda/etc/i386/package project1/bar/baz/schwing/yadda/etc/i386/package 
$ cd .. 
$ svn co svn+ssh://svn/project1/bar/baz/schwing/yadda/etc/i386/package2 package2 

現在,你模仿庫結構,但不必做深稀疏檢出的工作。

如果以上都不能幫助你,除了可能寫一個腳本來爲你做稀疏檢出之外,沒有什麼可以做的。您可以編寫一個腳本來獲取URL,然後將它解析爲一系列稀疏的簽出,但沒有像標準Subversion命令行客戶端內置的那樣。

+1

在需要作爲問題提及「更新項目至版本」

  • 配置什麼,我需要工作可怕ctory佈局或多或少地反映版本庫的佈局。 (主要是爲了一些自動化工具的好處。)我知道,可以在回購站中的任意路徑啓動他/她的工作目錄。切換VCS不是一種選擇,我工作的公司在後端與Subversion結婚(很可能是一個特殊的_version_,甚至是)所有的永恆。不過,請欣賞這些建議。 – eil

  • +0

    @eil看到我的答案附加了答覆 –

    0

    我真的不知道是否有一個正確的方法來使用命令行客戶端(從看起來沒有的其他響應)做到這一點,但如果您在Windows上使用TortoiseSVN這是相當的簡單。

    1. 做你的稀疏結帳您感興趣的頂層文件夾。
    2. 右鍵單擊該文件夾並選擇「打開庫瀏覽器」從TortoiseSVN的集成資源管理器外殼選項
    3. 瀏覽到嵌套子文件夾你關心,右鍵單擊並選擇在對話框(默認值通常是罰款),然後按OK
    相關問題