2011-02-09 40 views
2

我爲我自己的基於SQL和Subversion的程序編寫了一個部署工具。如何「svn刪除」一個文件夾,然後添加一個同名的文件夾?

我可以創建不同版本的應用程序,並將它們存儲在Subversion中,而這些信息存儲在SQL中。

直到我的「部署工具」工作得很好,但現在我發現了一個問題。

當創建一個應用程序版本時,我會檢查主版本並在程序中將其可視化。 然後可以通過刪除,重命名,添加或覆蓋文件和文件夾來編輯最新版本。

說,如果我有我的工作拷貝下面的樹結構:

- ProgramFiles 
    - Assemblies 
    - Data 
    - Type 1 
     - ... 
    - Type 2 
     - ... 
    - Type 3 
     - ... 

我想更換一個目錄(數據)。這會調用svn delete,並在該目錄之後刪除,因爲「svn delete」只會在您執行提交時將要刪除的文件夾標記爲已標記。 現在我想再次添加一個名爲「數據」的文件夾與新的子文件夾和文件,但後來我得到一個異常「工作副本管理區域丟失」。 據我可以告訴問題是,在ProgramFiles下的目錄.svn存儲的信息,文件夾數據將被刪除,如果我讀這個文件夾它崩潰。
我也知道我可以在添加文件夾之前進行提交,但這會增加我的修訂版本號,使用「非穩定版本」。

我該如何解決這個問題?

回答

0

難道你不能刪除文件夾的內容而不是刪除文件夾(但不要刪除「.svn」文件夾!),然後把新文件放在那裏?

+0

如果一個子文件夾的名稱等於一個已刪除的子文件夾,則與子文件夾的問題相同 – 2011-02-09 12:41:57

+0

@Robin:ooh,討厭。沒關係。 – 2011-02-09 12:59:55

1

你不能用一個做這個承諾,你需要提交刪除和附加分別

0

嗯,我已經想過這個問題後一會兒假設,這是不可能的事我米試圖在這裏做我有一個想法。

我實際上正在做的工作是工作副本,即交換,刪除,移動添加等。所有這些變化都將在我的程序中形象化。 (基於文件系統上的文件夾結構)

所有這些更改都不應提交,直到用戶想將其另存爲新的「數據包」。這表示他可以取消進度,沒有任何提交都沒有改變。

我知道嘗試做一個解決方法做出口第一。編輯這些文件夾和文件。 當我現在準備提交時,我簽出相同的路徑,刪除工作副本中不存在的所有內容,並將所有新文件從導出添加到工作副本中。

這只是一個解決方法,但唯一的事情是通過我的腦海。

是否有一種方法在顛覆做類似的事情?我的解決方法運行速度只有以前的一半,因爲導出和結帳,而不是隻檢出程序。

此外,兩個文件夾的比較真的很複雜。有誰知道一個解決方案來簡化這個?

0

如果你需要在一次提交中執行這個操作,那麼這是可能的,但棘手!

而不是簡單的svn delete然後Directory.Delete(...)你應該寫一個函數遞歸檢查文件和文件夾的現任vs想要的。

僞代碼:

function OverwriteFolder(old, new){ 
    foreach (file system) object in old or new{ 
     if object is in old and new{ 
      if object is file{ 
       overwrite file //no svn command needed 
      } 
      if object is folder{ 
       OverwriteFolder(old/object,new/object) 
      } 
     } 
     if file is in old and not new{ 
      svn delete object 
     } 
     if file is in new and not old{ 
      svn add object 
     } 
    } 
} 

現在應該在一個單一的工作承諾。它只會在您試圖用同名文件替換文件夾時失敗,反之亦然。

相關問題