我为自己的程序编写了一个基于SQL和Subversion的部署工具。
我能够创建不同版本的应用程序并将它们与Subversion一起存储,而这些应用程序的信息存储在SQL中。
直到我的“部署工具”工作得很好,但现在我发现了一个问题。
在创建应用程序版本时,我会检查头版本并在我的程序中将其可视化。 然后可以通过删除,重命名,添加或覆盖文件和文件夹来编辑最新版本。
说,如果我的工作副本中有以下树结构:
- ProgramFiles
- Assemblies
- Data
- Type 1
- ...
- Type 2
- ...
- Type 3
- ...
我想替换一个目录(Data)。这会调用svn delete,然后调用Directory.Delete,因为“svn delete”只是在执行提交时标记要删除的文件夹。
现在我想用新的子文件夹和文件再次添加一个名为“Data”的文件夹,但后来我得到一个例外“缺少工作副本管理区域”。
据我所知,问题是ProgramFiles下的.svn目录存储了删除文件夹Data的信息,如果我读到这个文件夹就会崩溃。
我也知道我可以在添加文件夹之前提交,但这会增加我的版本号,使用“非稳定版本”。
我该如何解决这个问题?
答案 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
}
}
}
现在它应该在一次提交中工作。只有当您尝试使用同名文件替换文件夹时才会失败。反之亦然。