我的工作室最近从 SourceSafe 切换到 Subversion,使我们摆脱了自动锁定。这导致了表单的并发编辑,这很棒。但是当多个开发人员提交他们的更改时,设计人员创建的代码文件(所有名为 的文件TheFormName.designer.cs
)会引起冲突,很难解决。
据我所知,这是因为每当用户修改它时,设计器生成的代码都会被大量重新排列,无论实际的改变有多么小。
- 如何让这些冲突更容易解决?
- 有没有办法告诉设计者少修改代码?
- 经验丰富的 C# 团队如何处理表单的并发修改?
我的工作室最近从 SourceSafe 切换到 Subversion,使我们摆脱了自动锁定。这导致了表单的并发编辑,这很棒。但是当多个开发人员提交他们的更改时,设计人员创建的代码文件(所有名为 的文件TheFormName.designer.cs
)会引起冲突,很难解决。
据我所知,这是因为每当用户修改它时,设计器生成的代码都会被大量重新排列,无论实际的改变有多么小。
以下是一些可以尝试的事情:
希望有帮助。
我很确定这个问题没有灵丹妙药,因为设计师踩遍了designer.cs。
我所能建议的就是尽量减少设计师的使用。就我个人而言,我只挂钩代码中的事件,并且只使用设计器进行初始化和定位。因此,理解变更集的差异并不难(“哦,有人添加了一个按钮”,“哦,有人稍微改变了它的外观”)。
是的,设计师的随意重新排列确实很烦人。Microsoft 是否使用自己的工具?Microsoft 是否会查看他们检查到版本控制的内容?它令人难以置信。
我们团队的“解决方案”是在编辑完 Designer 文件后手动编辑它们,将内容放回原来的位置,这样基于文本的差异就可以阅读,从而可以合理地合并并发更改。幸运的是,Visual Studio 的大部分重新排列都是简单的,所以这是可行的。
遗憾的是,我们发现此步骤对于验证正确性是必要的——我们发现了 Designer 默默删除所需内容的情况,从而导致代码损坏。因此,必须完成此步骤才能解决潜伏在内部的任何破坏数据的错误。叹。
由于微软在修复其错误方面的记录很差,唯一的解决方案可能是改进Mono 的 WinForms Designer,以便为黄金时间做好准备。
我不熟悉 C# 或 Windows 窗体设计器,但查看一些designer.cs
我可以在网上找到的文件,它们的结构并不特别复杂。
它的哪些部分正在重新安排?InitializeComponent()
我想这主要是混乱的方法中的属性顺序?
如果是这种情况,您也许可以编写一个简单的脚本,按字母顺序重新排序这些行,比如说(尤其是如果您从未手动编辑这些文件),并将其用作 Subversion 中的预提交挂钩脚本。
嗯,对……从头开始。该部分底部的大红色框表示您不应该修改挂钩脚本中的事务。但是您可能能够找到另一种方法来在designer.cs
文件被更改和被提交之间的某个地方运行该脚本。
实际上,鉴于 scraimer 对此的评论:
完全破解,但在最坏的情况下,就在合并之前,我可以对两个文件进行排序,并使合并简单地逐行处理......
你不能让Subversion设置一个外部合并程序吗?我一直在使用KDiff3,它可以在执行 diffs 或 merges 之前运行预处理器命令,因此您可以自动化该过程。
我知道在使用诸如颠覆之类的合并样式源代码控制系统时真正避免此问题的唯一方法是手动编写表单代码而不使用设计器。显然,这并不好,因为手动编码这些表单可能需要一段时间。
发生这种情况的原因是控件属性由设计器按照它们在窗体上的放置顺序进行序列化。剪切和粘贴可以影响此顺序以及移动控件以使其具有新的父级(例如将控件移动到面板上,而该控件以前直接位于窗体上)。
我在一个大型项目中遇到了这个问题,不得不采用一种相当丑陋的方法 - 将 Designer.cs 文件与签入目标修订版进行比较,并使用合并工具手动合并它们。这并不理想,但这是我看到它与 svn 或其他合并样式源代码控制工具一致工作的唯一方法。
正如其他人所指出的那样,另一种选择是使用带有源代码控制的锁定方法,但这也带来了令人不快的副作用。