当我在我的存储库中合并内容时,Subversion 想要将大量 svn:mergeinfo
属性添加/更改到与我想要合并的内容完全无关的文件中。
之前在 Stack Overflow 上已询问过有关此行为的问题:
工作副本根以外的路径上的 SVN Mergeinfo 属性
有没有办法使用 svn:mergeinfo 关闭 TortoiseSVN?
根据我从上述主题中了解到的情况,我的存储库中的许多文件似乎都有明确的 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 管道。
如 this thread 中所述:
大多数空的合并信息(“空白”)可能是由于源项目没有明确的合并信息的工作副本到工作副本副本/移动引起的。除非您使用 1.6 SVN,否则使用 propdel 可能是解决方案:从 1.5.5 开始,这些 WC-to-WC 副本不再在目标上创建空的 mergeinfo
较早的 svn move (rename) 重组操作也可以传播 mergeinfo,而不是将它们留在根目录中
有一个潜在的内存问题,由案例 3393 跟踪,将在即将发布的 1.6.2 版本中修复并在 1.5 中向后移植
由于我对盲目的 svn:merge-info
属性删除没有信心,我已经实现了一个工具来分析工作副本的当前情况并从非根合并信息属性中删除尽可能多的合并修订。在额外的人工检查和控制之后,可以提交对工作副本的更改。
不要犹豫,报告有关其使用的任何问题以改进它。
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
它获取已更改文件的列表,将其过滤为仅合并信息更改,删除除实际文件路径之外的所有内容,将每行路径转换为空格分隔列表,然后在该列表上恢复调用。
--xml
标志和 XML 解析器;其他任何内容都可以在版本之间更改,因为不能保证文本输出格式的前向兼容性。
除了盲目地删除 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)
此命令的好处:
它处理子树,但不处理根目录;它处理隐藏(“点”)文件;它会忽略不受版本控制的文件。
PS。如果您在根目录中提交了名称中带有空格(或其他不寻常符号?)的文件,命令可能会失败。