2

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

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

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

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

假设我的工作副本中有以下树结构:

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

我想替换一个目录(数据)。这会调用 svn delete,然后调用 Directory.Delete,因为“svn delete”只是在您进行提交时将文件夹标记为删除。现在我想再次添加一个名为“Data”的文件夹,其中包含新的子文件夹和文件,但随后出现异常“缺少工作副本管理区域”。据我所知,问题是 ProgramFiles 下的 .svn 目录存储了文件夹 Data 应被删除的信息,如果我读取此文件夹,它会崩溃。
我也知道我可以在添加文件夹之前提交,但这会增加我的“非稳定版本”的修订号。

我怎么解决这个问题?

4

4 回答 4

2

你不能一次提交,你需要分别提交删除和添加

于 2011-02-09T12:57:07.623 回答
0

If you need this to be performed in a single commit then it is possible, but tricky!

Instead of the simple svn delete and then Directory.Delete(...) you should write a function that recursively checks files and folders of incumbent vs desired.

Pseudo code:

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

Now it should work in a single commit. it only fails if you're trying to replace a folder with a file of the same name or vice-versa.

于 2011-09-01T19:34:27.207 回答
0

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

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

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

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

这只是一种解决方法,但我想到的唯一一件事。

有没有一种颠覆的方法做这样的事情?由于导出和签出而不是仅签出程序,我的解决方法的运行速度只有以前的一半。

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

于 2011-02-09T14:31:28.577 回答
0

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

于 2011-02-09T11:30:06.153 回答