删除不必要的svn:mergeinfo属性


136

当我合并存储库中的内容时,Subversion想要向svn:mergeinfo与文件完全无关的文件添加/更改许多属性。

在此之前,已经在堆栈溢出问题中问过有关此行为的问题:

从上面提到的主题中我了解到,似乎我的存储库中的许多文件在svn:mergeinfo其上不应具有显式属性。建议是减少数量,仅将这些属性放在相关的文件/文件夹中。

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

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

Answers:


142

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

从项目的根开始:

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

57
或者,只是不要在根目录“ svn propdel -R svn:mergeinfo ./*”上执行此操作
JeremyWeir 2011年

3
如果您还具有“ .dot” / * ix隐藏文件,则“ svn propdel -R svn:mergeinfo ./* ./.[^.]*”,对于该问题,Windows用户可能不是问题。
彼得

3
抑制输出加快速度:“ svn propdel svn:mergeinfo -R> nul”(或使用Linux> / dev / null)
bebbo 2014年

2
@JeremyWeir“仅不在根目录上执行”是什么意思?从哪里开始?您对该评论有很多反对意见,但我没有其他选择。
TT。

3
@TT。我认为这个想法是只转到包含所有混乱的合并信息的目录,然后从那里进行操作,因此您不必还原根目录。您不想弄乱根目录的mergeinfo。
JeremyWeir '16

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
在文件中使用连字符:svn propget -R svn:mergeinfo | grep -v“ ^ /” | grep -v“ ^ \”。| 切“ -d” -f1 | xargs svn propdel svn:mergeinfo
松鼠

12

本主题所述

  • 大多数空的mergeinfo(“空白”)可能是由于工作副本到源项目没有显式mergeinfo的工作副本副本/移动而引起的。除非您使用的是1.6 SVN,否则可以使用propdel作为解决方案:从1.5.5开始,这些WC-to-WC副本不再在目标位置创建空的mergeinfo
  • 较早的svn move(重命名)重组操作也可以传播mergeinfo,而不是将其保留在根目录中
  • 存在潜在的内存问题,由案例3393跟踪,将在即将发布的1.6.2版本中修复,并在1.5中反向移植

6

由于我对盲目svn:merge-info删除属性不满意,因此我实现了一种工具,可以分析工作副本上的当前状况,并从非根合并信息属性中删除尽可能多的合并修订。经过其他人工检查和控制后,可以提交工作副本上的更改。

它在这里:svn-clean-mergeinfo

请毫不犹豫地报告有关其用法的任何问题以得到改进。

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


2
该工具非常适合合并合并信息属性,例如通过部分子目录合并创建的类型,而这种合并可能不如大型团队中完全协调的开发人员创建。该工具似乎与每个分支都不存在的文件有关,我在文件上得到了剩余的merge-info属性,该属性指示分支上从未存在过的分支的修订版本。
davenpcj 2015年

我同意这并不完美……这就是为什么仍然需要“人工检查和控制”的原因。就您而言,如果您在merge-info属性中标识了不相关的修订,则可以在提交之前删除这些修订或该文件上的整个svn:merge-info属性。请使用github寻求改进。
伊夫·马丁

4

我知道已经有一段时间了,但是我遇到了类似的问题。我正在使用TortoiseSVN 1.6.7。恰好该属性位于我的工作副本的根目录中。当我查看根目录上的属性并单击svn:mergeinfo上的“删除”时,它询问我是否要递归删除它。这摆脱了我所有的svn:mergeinfo样机。


我当时的情况也一样。为我工作。谢谢!
andrewd18 2011年

2

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

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

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


2
Thanx,但是您可能已经提到我提到了TortoiseSVN,我是Windows用户,并且不使用Bash shell :-)
LeonZandman

尽管可能不那么简洁,但在DOS中应该可以进行相同的操作。
Chase Seibert

1
这不是仅还原当前工作目录上具有经过修改的mergeinfo的文件吗?如果是这样,则无法解决问题:现有的显式mergeinfo。为此,您需要推进。
Dominic Sc​​heirlinck,2009年

2
这是相当多的错误-名称中包含空格的文件名吗?名称中带有glob字符?无论哪种情况都不好。批准/支持的从svn状态解析输出的方法是使用--xml标志和XML解析器。版本之间的任何其他更改都可以更改,因为不能保证文本输出格式的前向兼容性。
查尔斯·达菲

2

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

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

通常,此合并最终仅应更改mergeinfo属性,而不更改任何实际文件。(如果最终确实会更改文件,那么以前的合并之一必须仅是部分合并,无论如何这可能一直在导致您遇到问题。)

一旦您使它们完全匹配,这样做最终将为您删除mergeinfo属性。您可能还需要做相反的事情:将仅存在于子文件夹中的所有合并修订合并到根中(再次,您可以粘贴完整列表,然后让SVN整理出适合您的差异)。


1

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

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

运行连接到1.5服务器的1.6.12客户端时,我也遇到类似的问题。还有在需要它自己的svn项目子目录:合并信息,但有(用“SVN:忽略*”包括以下./var 5根目录)121名这样的条目似乎有点不合适。因此,最好有一个(例如Python)脚本,该脚本能够删除明显多余的合并信息并告知其他差异...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.