删除不必要的svn:mergeinfo属性

时间:2009-04-20 08:37:41

标签: svn merge tortoisesvn svn-mergeinfo

当我在我的存储库中合并东西时,Subversion希望将大量svn:mergeinfo属性添加/更改为与我想要合并的内容完全无关的文件。

有关此行为的问题之前已在Stack Overflow上提出过:

根据我对上述主题的理解,我的存储库中的很多文件看起来都有明确的svn:mergeinfo属性,而不应该。建议是减少金额,只将这些属性放在相关的文件/文件夹上。

所以现在我的问题是:如何轻松删除那些不需要的属性?我正在使用TortoiseSVN,但我不愿意手动检查/修复数百个文件。有没有更简单的方法来删除那些不必要的svn:mergeinfo属性?

P.S。我正在寻找C ++ SVN API代码。

8 个答案:

答案 0 :(得分:138)

这是删除所有子树svn:mergeinfo属性但不在根文件夹中的另一种方法(这是分支正常工作所必需的。)

从项目的根目录开始:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

答案 1 :(得分:15)

这是一种删除所有子树svn:mergeinfo属性的方法。在存储库的根目录中运行它:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

一行代码便于复制/粘贴:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

要在运行之前预览这将影响哪些文件,请将最后一个“propdel”更改为“propget”或完全删除最后一个xargs管道。

答案 2 :(得分:12)

this thread中所述:

  • 大多数空的mergeinfo(“空白”)可能是由于工作副本到工作副本副本/移动而导致源项目没有显式mergeinfo。除非您使用的是1.6 SVN,否则使用propdel可能是解决方案:从1.5.5开始,这些WC-to-WC副本不再在目标上创建空的mergeinfo
  • 早期的svn move(重命名)重组操作也可以传播mergeinfo,而不是将它们留在根目录
  • 存在潜在的内存问题,由case 3393跟踪,将在即将推出的1.6.2版本中修复并在1.5中进行后端移植

答案 3 :(得分:6)

由于我对盲svn:merge-info属性删除没有信心,我已经实现了一个工具来分析工作副本的当前情况,并从非root合并信息属性中删除尽可能多的合并修订。在进行额外的人工检查和控制后,可以提交工作副本上的更改。

这是:svn-clean-mergeinfo

不要犹豫,报告任何有关其用途的问题,以便改进它。

Subversion 1.10引入了一个专门用于该任务的新工具:svn-mergeinfo-normalizer

答案 4 :(得分:4)

我知道已经有一段时间了,但我遇到了类似的问题。我正在使用TortoiseSVN 1.6.7。事实就是这个属性是我工作副本的根源。当我在root上查看属性并单击svn:mergeinfo上的Remove时,它询问我是否要以递归方式删除它。这摆脱了我所有的svn:mergeinfo cockups。

答案 5 :(得分:2)

如果您确定要批量删除mergeinfo属性,可以使用以下BASH脚本。

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

它获取已更改文件的列表,将其过滤为仅仅mergeinfo更改,除了实际文件路径之外的所有内容,将每行一个路径转换为空格分隔列表,并且调用将在该列表上恢复。 / p>

答案 6 :(得分:2)

不仅可以盲目地删除mergeinfo属性,还可以完成“缺失”合并。

从根文件夹复制mergeinfo属性,然后在子文件夹上执行合适的相对路径和完全相同的修订列表的合并。 (您可以,但不需要,仅列出此列表与子文件夹中已有的列表之间的差异。)

通常,此合并最终应仅更改mergeinfo属性,而不是任何实际文件。 (如果它确实最终改变了文件,那么之前的合并之一必须只是部分合并,这可能会导致你的问题。)

执行此操作最终应该为您删除mergeinfo属性,一旦您将它们两者完全匹配。您可能还需要执行相反的操作:将只包含在子文件夹中的任何合并修订版合并到根目录中(同样,您可以粘贴完整列表,让SVN进行排序,找出差异)。

答案 7 :(得分:1)

要对目录结构进行更改,这将是(非DOS'仅'查找':

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

运行连接到1.5服务器的1.6.12客户端,我遇到了类似的问题; 项目中的一个子目录,它需要自己的svn:mergeinfo,但是有121个这样的条目(包括./var下面的5个目录和“svn:ignore *”)似乎有些不合适。因此,有一个(例如Python)脚本能够删除明显多余的合并信息并告诉其他差异会很好...

相关问题