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

Posted

技术标签:

【中文标题】有没有办法使用 svn:mergeinfo 关闭 TortoiseSVN?【英文标题】:Is there a way to turn TortoiseSVN using svn:mergeinfo off? 【发布时间】:2010-10-11 23:11:34 【问题描述】:

当我进行 TortoiseSVN 合并时,它包括一堆目录,以及一些文件到修改后的文件中,即使没有实际更改。

它改变了svn:mergeinfo的属性。

是否有任何理由需要在目录/文件上设置这些属性?有什么办法可以避免不对svn:mergeinfo 进行这些更改?

我通常只是还原项目然后提交,但这会浪费额外的时间。

【问题讨论】:

【参考方案1】:

这种情况很可能发生,因为这些文件和目录具有先前合并的 svn:mergeinfo 属性集。我不认为以导致将mergeinfo写入单个文件的方式合并单个文件或目录通常不是一个好主意。您应该养成在工作流可能的***别进行合并的习惯,以便仅在结构目录(例如 /trunk 或 /branches/1.0)上设置 mergeinfo 属性。

但是,如果您发现自己在单个文件和文件夹上使用了 mergeinfo 属性,您可以做两件事:第一件事就是从相关文件和目录中删除 svn:mergeinfo 属性。除非您真的知道自己在做什么以及可能产生的影响,否则我不确定是否建议这样做。在执行此操作之前请阅读文档!

您可以做的第二件事是按照 SVN 的要求提交属性更改,如果您信任该软件,这可能是正确的做法。

话虽如此,我一直在和我的队友一起努力养成正确的习惯,这样我们就不会再有这种烦恼了。

【讨论】:

谢谢,哪些文件具有此属性集似乎几乎是随机的,而且它必须来自过去的开发人员从非根目录合并。我会删除它们。 非常感谢您澄清这是怎么发生的 :) 我按照你的建议编辑属性告诉 svn 一切正常。不过有一个问题……起初,我用主干的当前版本更新了分支的额外元数据文件。当我尝试重新集成到主干工作副本中时,svn 告诉我必须先更新。我更新并注意到 svn 版本增加了。这很明显:属性在分支中的提交导致全局 rev 被碰撞。然后我再次编辑了mergeinfos,这一次在当前版本之前指定了主干的一个版本。那时一切都很好。 我在尝试合并来自分支的更改时收到了相同的消息 - 也是分支创建修订。当我取消选中分支创建修订时,它就像一个魅力。谢谢。【参考方案2】:

SVN 1.7 及更高版本

这应该在 SVN 1.7 中修复。来自the release notes:

如果子树不受合并影响,则合并不再在子树(具有自己的显式合并信息)上记录合并信息(描述合并)。对于拥有大量具有显式合并信息的子树的用户,这应该会大大减少虚假的 svn:mergeinfo 属性更改的数量。

SVN 1.7 之前的版本

发生的情况是,一旦文件/文件夹具有明确的合并信息,每个 随后合并到分支将更新该合并信息,即使 文件/文件夹不相关。这很烦人,因为它引入了越来越多的 每次合并的变更列表都很混乱。

为避免这种情况,只合并到分支的“根”文件夹,例如 “/branches/maintenance2.x”。没有以下文件或文件夹 “/branches/maintenance2.x”然后应该得到mergeinfo。关注merging advice in the SVN book。

不幸的是,即使你只在分支的“根”文件夹合并, 空的svn:mergeinfo 属性仍然可以出现在单个文件上,并且 复制文件夹时,表明它们尚未收到 与他们的兄弟姐妹相同的合并。

删除多余的子树合并信息可能是安全的。一种方法是递归删除项目根目录中每个文件和文件夹的 svn:mergeinfo 属性。 (但将合并信息保留在根文件夹本身!)

或者,您可以升级到Subversion 1.6。我已经验证它可以解决这个问题。它甚至似乎为您删除了早期版本添加的多余合并信息。

从 cmets 来看,在 SVN 1.6 中仍然存在出现多余子树合并信息的情况。但我无法重现。

【讨论】:

我可以确认 svn 1.6 没有解决这个问题。 但是我可以确认,只需手动删除所有额外的属性就可以解决大部分问题。 仅使用 1.6 并不能解决此问题,因为它实际上是预期的功能,尽管对于使用典型分支/主干模型的人来说有点烦人。 如果你说的是 1.6 修复了一些问题,这是否意味着我必须更新客户端、服务器或两者? 我正在使用 svn 1.7x 并且可以确认我仍然遇到在根目录的直接子级上生成 mergeinfo 的问题。【参考方案3】:

如果您使用 --ignore-ancestry 选项进行合并,则首先不会创建 mergeinfo 属性。

svn merge --ignore-ancestry -c 1234 svn://sourcecontrol .

【讨论】:

【参考方案4】:

如果你勾选 Ignore ancestry,它不会在文件夹中创建 svn mergeinfo。如果您已经获得了 svn 合并信息,只需将其还原并通过检查忽略祖先再次进行合并。

【讨论】:

【参考方案5】:

svn:mergeinfo 是 Subversion 用于track merge history 的属性。我只是让它做它必须做的事情......稍后您可能需要合并历史跟踪并发现它不起作用,因为您没有提交这些属性。

【讨论】:

我同意,这只是元数据,随着 SVN 客户端软件(例如 TortoiseSVN)的发展,它将变得更加有用。【参考方案6】:

堆栈溢出问题Remove unnecessary svn:mergeinfo properties 中给出的命令将删除任何额外的合并信息。

From the root of the project do:

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

【讨论】:

【参考方案7】:

我要补充一点,这个错误的至少一部分已在 Subversion 1.5.5 中得到修复。来自1.5.5 CHANGES file:

do not create mergeinfo for wc-wc moves or copies (r34184, -585)

也就是说,在 1.5 之前的 SVN 中存在一个错误,它会创建它不使用的合并信息条目,并且是多余的,如果原始提问者有很多 @987654323,这很可能是他们遇到的问题@ 属性。

【讨论】:

【参考方案8】:

我们在我们的项目中递归地删除了它,因为几乎所有文件都有这个信息,这使得合并非常烦人(如果只有一个文件被更改,所有文件都必须合并)。从现在开始,我们将只在根上合并,这应该避免将来出现这种情况。

到目前为止,它还没有给我们带来任何问题。日志仍然可以在文件上使用,而且看起来是一样的(但无论如何都要自己承担风险!)。

哦,我们是在树干上做的,就在制作新分支之前。这样,我们就可以从头开始。

【讨论】:

【参考方案9】:

我们的团队也遇到过这个问题,这让整个合并过程有点混乱。 读完这篇文章后,我尝试从多个文件中删除 svn:mergeinfo 属性,经过进一步测试,似乎解决了问题。

【讨论】:

"我尝试从多个文件中删除 svn:mergeinfo 属性" -- 怎么样?以及哪些文件?【参考方案10】:

很好的问答!我们最近遇到了这个问题,因为我们正在尝试解决我们自动构建系统的限制。我们的构建系统会自动增加 .bdsproj 和一些 .dpr/.dpk 文件的版本和路径信息。

我想改变它...但是现在,如果你想将一个分支与另一个合并,你会得到你改变的少数文件,然后是构建机器改变的 1000 个文件。所以我们一直在做“有针对性的”合并,有时一次一个文件。尤其是具有合法更改的 .dpr 或 .bdsproj 文件(例如包含额外的单元)。 现在我知道发生了什么,所以我希望能制止这种疯狂。

感谢堆栈溢出!

【讨论】:

以上是关于有没有办法使用 svn:mergeinfo 关闭 TortoiseSVN?的主要内容,如果未能解决你的问题,请参考以下文章

svn pre-commit hook 禁止在非根目录上使用 svn:mergeinfo

Tortoise 1.9:Merge 不记录 mergeinfo

删除不必要的 svn:mergeinfo 属性

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

svn常用快捷命令集合。

有没有办法使用 cli 关闭和启动 AWS redshift 集群?