ChatGPT解决这个技术问题 Extra ChatGPT

删除不必要的 svn:mergeinfo 属性

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

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

工作副本根以外的路径上的 SVN Mergeinfo 属性

有没有办法使用 svn:mergeinfo 关闭 TortoiseSVN?

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

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

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


V
Vincent

这是删除所有子树 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。我认为这个想法是直接转到包含所有混乱合并信息的目录并从那里进行操作,因此您不必还原根目录。您不想弄乱根目录的合并信息。
K
Kelvin

这是一种删除所有子树 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
o
opello

this thread 中所述:

大多数空的合并信息(“空白”)可能是由于源项目没有明确的合并信息的工作副本到工作副本副本/移动引起的。除非您使用 1.6 SVN,否则使用 propdel 可能是解决方案:从 1.5.5 开始,这些 WC-to-WC 副本不再在目标上创建空的 mergeinfo

较早的 svn move (rename) 重组操作也可以传播 mergeinfo,而不是将它们留在根目录中

有一个潜在的内存问题,由案例 3393 跟踪,将在即将发布的 1.6.2 版本中修复并在 1.5 中向后移植


Y
Yves Martin

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

这是:svn-clean-mergeinfo

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

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


该工具非常适合整合合并信息属性,例如通过部分子目录合并创建的类型,大型团队中的许多不完全协调的开发人员可能会创建这些属性。该工具似乎在每个分支中都不存在的文件存在问题,我在文件上获得剩余的合并信息属性,指示文件从未存在的分支上的修订。
我同意它并不完美......这就是为什么仍然需要“人工检查和控制”。在您的情况下,如果您在合并信息属性中确定了不相关的修订,您可以在提交之前删除这些修订或该文件上的整个 svn:merge-info 属性。请使用 github 请求改进。
m
moribvndvs

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


我也有同样的情况。为我工作。谢谢!
C
Chase Seibert

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

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

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


谢谢,但你可能已经从我那里知道了 TortoiseSVN,我是 Windows 用户,不使用 Bash shell :-)
同样的事情在 DOS 中应该是可能的,尽管可能不那么简洁。
这不是只恢复当前工作目录上修改过的合并信息的文件吗?如果是这样,它并没有解决问题:现有的显式合并信息。为此,您需要propdel。
这很麻烦——文件名中有空格吗?名称中包含全局字符?无论哪种情况都是坏消息。从 svn status 解析输出的批准/支持的方法是使用 --xml 标志和 XML 解析器;其他任何内容都可以在版本之间更改,因为不能保证文本输出格式的前向兼容性。
M
Miral

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

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

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

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


T
Tobias

要在目录结构中进行更改,这将是(仅非 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)脚本,它能够删除明显多余的合并信息并讲述其他差异......


u
user_with_zhban_piva

从存储库的根目录运行以删除 svn:mergeinfo 属性:

Bash 命令:svn propdel -R -q svn:mergeinfo `svn ls`

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

此命令的好处:

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

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