删除不必要的 svn:mergeinfo 属性
Posted
技术标签:
【中文标题】删除不必要的 svn:mergeinfo 属性【英文标题】:Remove unnecessary svn:mergeinfo properties 【发布时间】:2010-10-20 12:37:20 【问题描述】:当我在我的存储库中合并内容时,Subversion 想要添加/更改很多 svn:mergeinfo
属性到与我想要合并的内容完全无关的文件中。
之前在 Stack Overflow 上已询问过有关此行为的问题:
SVN Mergeinfo properties on paths other than the working copy root Is there a way to turn TortoiseSVN using svn:mergeinfo off?根据我对上述主题的理解,我的存储库中的很多文件似乎都有明确的svn:mergeinfo
属性,而实际上它们不应该。建议是减少数量,仅将这些属性放在相关文件/文件夹中。
所以现在我的问题是:如何轻松删除那些不需要的属性?我正在使用 TortoiseSVN,但我不愿意手动检查/修复数百个文件。有没有更简单的方法来删除那些不必要的svn:mergeinfo
属性?
附:我不是在寻找 C++ SVN API 代码。
【问题讨论】:
【参考方案1】:这是删除所有子树 svn:mergeinfo 属性但不在根文件夹中的另一种方法(这是分支正常工作所必需的)。
从项目的根目录做:
svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
【讨论】:
或者,只是不要在根目录“svn propdel -R svn:mergeinfo ./*”上这样做 "svn propdel -R svn:mergeinfo ./* ./.[^.]*" 如果您还有“点”/*ix 隐藏文件,对于 Windows 用户来说可能不是问题问题。 抑制输出会加快速度:“svn propdel svn:mergeinfo -R >nul”(或 >/dev/null 使用 Linux) @JeremyWeir “只是不要在根目录上执行”是什么意思?那从哪里来?您对该评论有很多支持,但我没有看到其他选择。 @TT。我认为这个想法是直接转到包含所有混乱合并信息的目录并从那里进行操作,因此您不必还原根目录。你不想弄乱根目录的mergeinfo。【参考方案2】:这是一种删除所有子树 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 管道。
【讨论】:
与文件中的连字符一起使用:svn propget -R svn:mergeinfo | grep -v "^/" | grep -v "^\." |剪切“-d”-f1 | xargs svn propdel svn:mergeinfo【参考方案3】:如this thread中所述:
大多数空的合并信息(“空白”)可能是由于源项目没有明确的合并信息的工作副本到工作副本副本/移动造成的。除非您使用 1.6 SVN,否则使用 propdel 可能是解决方案:从 1.5.5 开始,这些 WC-to-WC 副本不再在目标上创建空的 mergeinfo 早期的 svn move(重命名)重组操作也可以传播 mergeinfo,而不是将它们留在根目录中 case 3393 跟踪了一个潜在的内存问题,该问题将在即将发布的 1.6.2 版本中修复并在 1.5 中向后移植【讨论】:
【参考方案4】:由于我对盲目的 svn:merge-info
属性删除没有信心,我已经实现了一个工具来分析工作副本的当前情况,并从非根合并信息属性中删除尽可能多的合并修订。在进行额外的人工检查和控制后,可以提交对工作副本的更改。
这里是:svn-clean-mergeinfo
请随时报告有关其使用的任何问题,以改进它。
Subversion 1.10 引入了一个专用于该任务的新工具:svn-mergeinfo-normalizer
【讨论】:
此工具非常适合整合合并信息属性,例如通过部分子目录合并创建的类型,大型团队中许多不完全协调的开发人员可能会创建这些属性。该工具似乎在每个分支中都不存在的文件存在问题,我在文件上获得剩余的合并信息属性,指示文件从未存在的分支上的修订。 我同意它并不完美......这就是为什么仍然需要“人工检查和控制”的原因。在您的情况下,如果您在合并信息属性中确定了不相关的修订,您可以在提交之前删除这些修订或该文件上的整个 svn:merge-info 属性。请使用github请求改进。【参考方案5】:我知道已经有一段时间了,但我遇到了类似的问题。我正在使用 TortoiseSVN 1.6.7。碰巧该属性位于我的工作副本的根目录上。当我查看根目录上的属性并单击 svn:mergeinfo 上的删除时,它询问我是否要递归删除它。这摆脱了我所有的 svn:mergeinfo cockups。
【讨论】:
我也遇到了同样的情况。为我工作。谢谢!【参考方案6】:如果您确定要批量删除 mergeinfo 属性,可以使用以下 BASH 脚本。
FILES=`svn status |grep "^ M " |sed s/" M "// |tr '\n', ' '`
svn revert $FILES
它获取已更改文件的列表,将其过滤为仅合并信息更改,删除除实际文件路径之外的所有内容,将每行路径转换为空格分隔的列表,然后在该列表上恢复调用。
【讨论】:
Thanx,但正如您可能从我那里知道的那样提到 TortoiseSVN 我是 Windows 用户并且不使用 Bash shell :-) 在 DOS 中应该可以做同样的事情,尽管可能不那么简洁。 这不是只恢复当前工作目录上修改过的合并信息的文件吗?如果是这样,它并没有解决问题:现有的显式合并信息。为此,您需要propdel。 这很麻烦——文件名中有空格吗?名称中包含全局字符?无论哪种情况都是坏消息。从 svn status 解析输出的批准/支持方法是使用--xml
标志和 XML 解析器;其他任何内容都可能在版本之间发生变化,因为无法保证文本输出格式的前向兼容性。【参考方案7】:
不只是盲目地删除mergeinfo属性,还可以完成“缺失”的合并。
从根文件夹复制 mergeinfo 属性,然后对子文件夹执行合并以获取适当的相对路径和完全相同的修订列表。 (您可以但不需要仅列出此列表与子文件夹中已有的列表之间的差异。)
通常,此合并最终只会更改 mergeinfo 属性,而不是任何实际文件。 (如果它最终改变了文件,那么之前的合并之一一定只是部分合并,这可能已经给你带来了问题。)
一旦你让它们完全匹配,这样做最终会为你删除 mergeinfo 属性。您可能还需要执行相反的操作:将仅存在于子文件夹中的任何合并修订合并到根目录中(同样,您可以粘贴完整列表并让 SVN 为您找出差异)。
【讨论】:
【参考方案8】:要更改目录结构,这将是(仅限非 DOS 'find'):
find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '' \;
运行连接到 1.5 服务器的 1.6.12 客户端,我遇到了类似的问题; 项目中有一个子目录需要它自己的 svn:mergeinfo,但是有 121 个这样的条目(包括 ./var 下面的 5 个目录,带有“svn:ignore *”)似乎有点不合适。因此,最好有一个(例如 Python)脚本,它能够删除明显多余的合并信息并说明其他差异......
【讨论】:
以上是关于删除不必要的 svn:mergeinfo 属性的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用 svn:mergeinfo 关闭 TortoiseSVN?
Tortoise 1.9:Merge 不记录 mergeinfo