合并文件夹删除与SVN导致"无效状态更新属性"错误

时间:2016-05-24 20:57:08

标签: svn merge

我在SVN中进行稀疏结账,为包含文件夹删除的小改动进行合并,这让我感到头疼。

以下是一个例子:

svn co https://bigrepo.company.com/ .
mkdir source_branch
mkdir source_branch/proc
mkdir source_branch/proc/new_folder
touch source_branch/proc/new_folder/new_thing
svn add . --force
svn ci
svn cp source_branch/ target_branch/
svn ci

然后在我想要合并的源分支中创建一个修订

svn del source_branch/proc/new_folder
svn ci

然后将它合并到另一个分支(稀疏结账)时:

svn co https://bigrepo.company.com/target_branch --depth empty .
svn up --depth empty proc
svn up --depth empty proc/new_folder
svn up --depth empty proc/new_folder/new_thing
svn merge https://bigrepo.company.com/source_branch -c 1635 .

svn给了我这个错误

  

svn:E155023:无法在&proc; / new_folder / new_thing'上设置属性:更新属性的状态无效。

但如果我像这样完整结帐:

svn co https://bigrepo.company.com/target_branch --depth infinity .
svn merge https://bigrepo.company.com/source_branch -c 1635 .

合并正常。为什么这不适用于稀疏结账?

我在不同级别进行了更新,我不确定为什么有些工作而有些人不做。

这不起作用:

svn co https://bigrepo.company.com/target_branch --depth empty .
svn up --depth empty proc/
svn up --depth infinity proc/new_folder
svn merge https://bigrepo.company.com/source_branch -c 1635 .

这有效:

svn co https://bigrepo.company.com/target_branch --depth empty .
svn up --depth infinity proc/
svn merge https://bigrepo.company.com/source_branch -c 1635 .

哪个好一点,但仍不理想

1 个答案:

答案 0 :(得分:3)

http://svnbook.red-bean.com/en/1.7/svn.branchmerge.advanced.html

  

避免与具有稀疏目录的目标合并。同样,不要合并到--depth = infinity

以外的深度

这可能就是SVN的工作原理;也就是说,在稀疏检查的工作副本上进行合并时效果不佳。

从我的能力来看,在进行合并时,SVN会将合并信息添加到文件和文件夹中。在哪个级别添加合并信息取决于工作副本的构建方式。也就是说,SVN是“聪明”的,足以知道如果你签出了一个带有--depth为空的文件夹,它只能为该修订版添加一个部分合并到该文件夹​​。如果您检出该文件夹下面的文件/文件夹,它也会在这些级别添加合并信息,它可能会在SVN执行所谓的“删除”步骤后合并该合并信息。

与--depth infinity的结帐相比,SVN不需要在较低级别跟踪合并信息,并且可以有效地跳过该文件夹树的完全删除步骤。

所以选项是,执行完整的 - 深度无限结账,或者停止使用SVN的合并跟踪并与--ignore-ancestry合并,这将正确执行合并,但不会发布mergeinfo。