2009-09-17 58 views
42

假設您有顛覆控制下的一個目錄,包含了一些文件和子目錄噸的,這樣的:SVN:你可以只從本地簽出(不是從存儲庫)中刪除目錄嗎?

file1.txt 
file2.txt 
file3.txt 
dir1/ 
dir2/ 
dir3/ 
dir4/ 
: 
dirXX/ 

現在你需要的文件和一些迪爾斯的,但不是所有的人。這可以通過SVN完成。只要使結賬非遞歸:

svn checkout -N <URL> 

這隻檢出第一個目錄和裏面的文件。沒有包含子目錄。即使您進入結帳目錄並運行「svn up」,它只會更新之前簽出的文件,但不會添加目錄。您現在可以通過明確更新這些目錄來選擇性地添加所需的目錄。例如。如果你需要DIR2,只有dir4,你可以進入檢出目錄並執行

svn up dir2 
svn up dir4 

如果你運行一個通用的「svn up」在未來,它只會更新文件和這兩個目錄,也不會添加任何其他目錄。

現在的問題:如果我稍後決定不再需要dir2,該怎麼辦?我如何擺脫它?似乎沒有辦法這樣做,除了刪除整個結帳並從頭開始。

當您剛剛刪除dir2時,下一個「svn up」將返回,因爲「svn status」當然顯示爲現在丟失(「!」在其名稱前面)。運行「svn remove」當然會將其刪除,但在下一次提交時,它也會將其從存儲庫中刪除,這一定不會發生。 SVN 1.5

即使是新的稀疏目錄(「淺結賬」)的特徵是沒有用在這裏:

顛覆1.5的實施 淺檢出是好的,但不支持 一對夫婦有趣的 行爲。首先,您不能刪除工作副本項目的望遠鏡 。 運行svn更新 - 設置深度爲空 在無限深度的工作副本中 不會產生 目錄中的所有內容,除了最上面的 目錄之外 - 它只會出錯。
- http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html

這是完全不可能的SVN?任何人都有過一個聰明的工作全面呢?

只需創建結帳目錄(不含SVN),然後直接從存儲庫中檢出各個子目錄作爲該目錄的子目錄即可用於目錄:現在每個目錄都是自己的結帳,可以更新一次不再需要,你可以刪除它。但是,如何獲取文件(例如file1.txt)? SVN不允許簽出單個文件,你只能簽出整個目錄。

+0

我想這是因爲這兩個同樣的問題:http://stackoverflow.com/questions/ 862950/subversion-prevent-local-modifications-to-one-file-from-being-committed,http:// stackoverflow。com/questions/635446/svn-is-there-a-way-to-mark-a-file-as-do-not-commit –

+0

@ire_and_curses:首先,你爲什麼不把它寫成答案?第二:這兩個問題是關於防止發生的事情。這與我的問題完全無關。即使我在目錄上執行了svn delete操作,並且阻止了該目錄的提交,該目錄也不會消失。你甚至讀過我的問題還是隻是標題? – Mecki

+0

@Mecki:我確實讀過你的問題,雖然我很匆忙地承認。我*想*你問過如何在本地副本中刪除版本控制的目錄而不影響版本庫版本,以及在下一次更新中沒有得到目錄。雖然我還沒有嘗試過,但似乎讓所有其他變更列表的成員都能做到這一點。我沒有寫這個答案,因爲它已經存在於其他兩個問題中(我認爲這兩個問題都是一樣的) - 如果我是對的,我只能代表別人的工作。對不起,如果這對你沒用。 –

回答

50

我討厭它來回答我自己的問題......它讓我感到非常愚蠢。而我更討厭成爲提供最佳答案的人,但不幸的是,這裏是唯一真正的答案:

我想要做的事情不能用Subversion 1.4或Subversion 1.5來完成;期。
沒有工作存在,這就是它的方式。

雖然它可以用Subversion 1.6來完成。

不同於SVN 1.5,SVN 1.6可以減少上的目錄

svn up --set-depth exclude dir2 

深度是解決方案。它將dir2的深度設置爲零,並且它將立即從結帳中消失,並且沒有更新會將其恢復,除非您將該目錄的深度再次明確設置爲一個值(或者只是在沒有深度的情況下對其進行更新,因爲不給任何深度總是意味着無窮大,除非你使用非遞歸,這​​意味着「文件」)。

提示:
其實SVN 1.6不能真正減少深度的方式可以增加它。您可以將其從任何級別增加到更高級別。您只能將其降至「排除」(全部最低級別)。如果你想從「無窮大」(最高)減少到「文件」(中間的某處),你必須首先將它減少到「排除」(導致目錄消失),然後再次將其增加回「文件」。這有點破解,但它工作得很好。

+1

+1,但它是「subversion 1.6」。沒有這樣的東西是「Subversion 6」 –

+4

對不起,我一直在使用Java太久了我猜 - > Java 2是Java 1.2,Java 5實際上是Java 1.5等等;-) – Mecki

+1

+1多個目錄可以通過給空間分隔值。示例:svn up --set-depth排除dir1 dir2 dir3 – Ritesh

1

你可以嘗試這個trick涉及本地存儲庫和svn:外部聲明。

雖然沒有嘗試過。

+0

這聽起來很有趣!第一個答案,已經是一個很好的(upvote)。不知道這是否是最好的解決方案,如果這真的會解決我的問題,但我應該試試這個解決方案。如果這項工作,沒有人有更簡單的提供,我會接受這個答案。即使它不能解決我的問題,也可能解決其他一些SVN問題(所以這個知識在任何情況下都很方便)。 – Mecki

+0

對不起,這不能真正解決我的問題。我可以創建一個本地存儲庫,並鏈接到一些子目錄,所以只有那些出現...我可能會取消它們之間的鏈接(刪除外部聲明),它們將消失...但我無法獲得文件fileX.txt在主目錄中,因爲你不能鏈接在單個文件中,只有目錄和鏈接在這個目錄中的文件和它的所有子目錄鏈接:( – Mecki

9

更新:我正在運行SVN 1.6.11,我能夠使用svn up --set-depth empty dir去望遠鏡,而不是必須exclude目錄。

1

對於svn 1.6,--set-depth就是答案。

使用SVN < 1.6,你可以通過濫用svn switch得到稀疏檢出:在你的倉庫的地方創建一個空目錄,並switch你不需要現在就指向,而不是他們的「真實」的URL的子目錄。

36

對於任何人誰遇到此之後,並使用TortoiseSVN的,這裏是如何做同樣的事情......

  1. 不再需要簽出的文件夾上單擊鼠標右鍵(這是要排除的文件夾)
  2. 從上下文菜單中選擇「TortoiseSVN>更新到修訂...」
  3. 在彈出的窗口中,將「更新深度」下拉框設置爲「排除「
  4. 單擊「確定」。 SVN會自動從您的驅動器中刪除該目錄。

(注:這是在TortoiseSVN 1.7.5完成,並可能對其它版本有所不同。)

+1

+1這對我很有幫助 – aolszowka

+2

這是一個救星。謝謝。 – Emanuel

+0

戈特保佑這個選擇#SSD –

相關問題