2012-08-31 62 views
2

我有一個包含大量目錄和文件的倉庫。對於scratchbuild,我只需要從根開始的樹的一個子集。深層次的一些不必要的子樹包含了大量不需要用於構建臨時文件的文件。我已經玩了--depth empty選項來檢出一棵稀疏的樹,但這很麻煩和倒退,因爲我結束了一個我想要的大白名單目錄,而不是一個我不想要的小黑名單目錄。由於需要監控我可能需要用於臨時構建的新目錄,因此白名單方法更加複雜。顛覆結賬:有沒有辦法跳過一個子樹?

是否有表達結帳遞歸dir但跳過dir/foo/bar/bazdir/frob/tweak沒有通過箍跳躍的方式?類似於-prune謂詞find(1)

回答

3

Subversion假定你想要整個目錄樹。有一種方法做稀疏檢出,但它是排序的箍通過機制跳躍:

首先,檢出的操作和設置--depth來立即數:

$ svn co --depth=immediates svn://localhost/myproject/trunk myproject-trunk 

這將簽出的所有文件和立即在根目錄下的目錄。

接下來,你可以使用所有種類的shell腳本魔法與--set-depth標誌更新只有那些你想要的目錄:

$ shopt -s extglob #Needed on BASH, but not Kornshell 
$ svn co --depth=immediates $REPO_URL 
$ svn up --set-depth=infinity !(foo|frob) 

上面會做所有的目錄樹的結賬除了foofrob

你也可以用find做類似的事情。

問題是Subversion非常簡單,並且被設計成這樣。在其他版本控制系統(如Perforce和ClearCase)中,您可以指定要檢出的內容,並在Perforce中指定要如何檢出。

但是,這要求您設置一個視圖這使得使用這些版本控制系統變得非常複雜得多。我喜歡Perforce。它快速且功能強大,但開發者因爲需要意見而討厭它。對他們來說,它增加了一些複雜性,但並沒有給他們帶來太多的好處。他們很少需要做稀疏結賬。

如果這是您的Subversion存儲庫的常見問題,您可能需要重新考慮您的佈局以使其更便利。這在Subversion中並不難,因爲整個存儲庫只是一個包含分支和標籤的文件樹。我們曾多次決定放棄中繼並將其替換爲特定的分支,或者重新命名和重構我們的存儲庫以使其更易於使用。

只要確保與開發人員協調任何大規模重組。如果你移動他們正在處理的目錄樹,他們會突然發現他們不能提交他們的改變(大多數情況下,他們可以做一個svn switch --relocate來解決這個問題。但是,我的經驗是,開發者寧願檢查在他們的東西,並開始一個乾淨的結帳。

+0

如果我正確理解你,這可以歸結爲從短黑名單(使用Unix工具箱)創建長白名單,然後讓svn工作在白名單,對嗎? – Jens

+0

@Jens這幾乎是它。我想可能[changelists](http://svnbook.red-bean.com/en/1.7/svn.advanced.changelists.html)可能會有幫助,但它們只適用於文件而不適用於目錄。 –

+0

我相信第二個svn命令應該是更新,而不是結帳。正確?這是現在的一箇舊的答案,所以也許有些改變。 – Pianosaurus

相關問題