删除不必要的svn:mergeinfo属性

当我在我的资源库中合并东西时,Subversion希望将很多svn:mergeinfo属性添加到与我想要合并的东西完全无关的文件中。

关于这个行为的问题已经在Stack Overflow之前问过了:

  • SVN Mergeinfo属性不是工作拷贝根目录
  • 有没有办法使用svn:mergeinfoclosuresTortoiseSVN?

从我从上面提到的主题中了解到,它看起来像我的仓库中的很多文件都有明确的svn:mergeinfo属性,当它们不应该。 build议是减less金额,只把这些属性放在相关的文件/文件夹中。

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

PS我不是在寻找C ++ SVN API代码。

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

从项目的根源来做:

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

这是删除所有子树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”或完全删除最后一个xargspipe道。

正如在这个线程中提到的:

  • 大多数空的mergeinfo(“空白”)可能是由工作副本复制到工作副本/移动源项目没有显式合并信息。 使用propdel可以是解决scheme,除非您使用1.6 SVN:自1.5.5以来,这些WC到WC的副本不再在目标上创build空的mergeinfo
  • 较早的svn move(rename)重构操作也可以传播mergeinfo,而不是将它们留在根目录下
  • 有一个潜在的记忆问题,由案例3393跟踪,将在即将到来的1.6.2版本中修复,并在1.5

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

这里是: svn-clean-mergeinfo

不要犹豫,报告任何有关其使用问题,以改善。

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

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

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

它获取已更改文件的列表,只对mergeinfo进行过滤,除了实际的文件path之外,将每行一行转换为空格分隔的列表,并将调用还原到该列表中。

我知道这是一段时间,但我遇到了类似的问题。 我使用的是TortoiseSVN 1.6.7。 它恰好发生了,财产是我的工作副本的根源。 当我查看根上的属性,并单击svn:mergeinfo上的删除,它问我是否要recursion删除它。 这摆脱了我所有的svn:mergeinfo cockups。

而不是盲目地删除mergeinfo属性,也可以完成“缺less”合并。

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

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

这样做应该最终会为你删除mergeinfo属性,一旦你得到他们两个完全匹配。 您可能还需要做相反的事情:合并到只存在于子文件夹中的任何合并版本的根目录(再次,您可以粘贴完整列表,让SVN为您找出差异)。

要在目录结构中进行更改,这将是(非DOS“查找”):

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

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