2011-02-09 172 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 
     } 
    } 
} 

现在应该在一个单一的工作承诺。它只会在您试图用同名文件替换文件夹时失败,反之亦然。

相关问题