如何“svn删除”一个文件夹,然后添加一个具有相同名称的文件夹?

时间:2011-02-09 10:35:48

标签: svn sharpsvn working-copy

我为自己的程序编写了一个基于SQL和Subversion的部署工具。

我能够创建不同版本的应用程序并将它们与Subversion一起存储,而这些应用程序的信息存储在SQL中。

直到我的“部署工具”工作得很好,但现在我发现了一个问题。

在创建应用程序版本时,我会检查头版本并在我的程序中将其可视化。 然后可以通过删除,重命名,添加或覆盖文件和文件夹来编辑最新版本。

说,如果我的工作副本中有以下树结构:

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

我想替换一个目录(Data)。这会调用svn delete,然后调用Directory.Delete,因为“svn delete”只是在执行提交时标记要删除的文件夹。 现在我想用新的子文件夹和文件再次添加一个名为“Data”的文件夹,但后来我得到一个例外“缺少工作副本管理区域”。 据我所知,问题是ProgramFiles下的.svn目录存储了删除文件夹Data的信息,如果我读到这个文件夹就会崩溃。
我也知道我可以在添加文件夹之前提交,但这会增加我的版本号,使用“非稳定版本”。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

您无法通过一次提交执行此操作,您需要提交删除和单独添加

答案 1 :(得分:0)

你不能只删除文件夹内容而不是删除文件夹(但不要删除“.svn”文件夹!),然后只将新文件放在那里?

答案 2 :(得分:0)

好吧,经过一段时间的考虑我已经考虑过这个问题,假设我不可能做我想做的事情,我有了一个想法。

我实际上要做的是,正在处理一个工作副本,这意味着交换,删除,移动添加等等。所有这些更改都应在我的程序中可视化。 (基于文件系统上的文件夹结构)

在用户想要将其保存为新的“数据包”之前,不应提交所有这些更改。这表明他可以取消进度,并且没有任何提交既没有改变。

我知道首先尝试了一种解决方法。编辑这些文件夹和文件。 当我现在准备提交时,我会检查相同的路径,删除工作副本中不存在的所有内容,并将所有新文件从导出添加到工作副本中。

这只是一种解决方法,但是我脑子里唯一想到的就是。

subversion中是否有一种方法可以做类似的事情?我的解决方法运行速度只有以前的一半,因为导出和检出而不是只检查程序。

两个文件夹的比较也非常复杂。有没有人知道简化这个的解决方案?

答案 3 :(得分:0)

如果您需要在一次提交中执行此操作,那么这是可能的,但很棘手!

而不是简单的svn delete然后Directory.Delete(...)你应该编写一个递归检查现任者与所需文件和文件夹的函数。

伪代码:

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
        }
    }
}

现在它应该在一次提交中工作。只有当您尝试使用同名文件替换文件夹时才会失败。反之亦然。