繁体   English   中英

删除不必要的 svn:mergeinfo 属性

[英]Remove unnecessary svn:mergeinfo properties

当我在我的存储库中合并东西时,Subversion 想要添加/更改很多svn:mergeinfo属性到与我想要合并的东西完全无关的文件中。

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

根据我对上述主题的理解,我的存储库中的很多文件似乎都有明确的svn:mergeinfo属性,而实际上它们不应该。 建议是减少数量,仅将这些属性放在相关文件/文件夹中。

所以现在我的问题是:如何轻松删除那些不需要的属性? 我正在使用 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”或完全删除最后一个 xargs 管道。

正如这个线程中提到的:

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

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

这里是: svn-clean-mergeinfo

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

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

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

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

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

它获取已更改文件的列表,将其过滤为仅合并信息更改,删除除实际文件路径之外的所有内容,将每行路径转换为空格分隔列表,然后在该列表上恢复调用。

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

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

通常,此合并最终应该只更改 mergeinfo 属性,而不是任何实际文件。 (如果它最终改变了文件,那么之前的合并之一一定只是部分合并,这可能已经给你带来了问题。)

一旦你让它们完全匹配,这样做应该最终会为你删除 mergeinfo 属性。 您可能还需要执行相反的操作:将仅存在于子文件夹中的任何合并修订合并到根目录中(同样,您可以粘贴完整列表并让 SVN 为您找出差异)。

要在目录结构中进行更改,这将是(仅非 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 属性:

  • Bash 命令: svn propdel -R -q svn:mergeinfo `svn ls`
  • PowerShell 命令: svn propdel -R -q svn:mergeinfo (svn ls)

此命令的好处:

  1. 它处理子树,但不处理根目录;
  2. 它处理隐藏(“点”)文件;
  3. 它会忽略不受版本控制的文件。

PS。 如果您在根目录中提交了名称中包含空格(或其他不寻常符号?)的文件,命令可能会失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM