为什么C#设计器生成的代码(如Form1.designer.cs)会对Subversion造成严重破坏?

Sha*_*mer 17 c# svn version-control windows-forms-designer visual-studio

我的工作室最近从SourceSafe切换到Subversion,让我们从自动锁中解脱出来.这导致了对Forms的并发编辑,这很精彩.但是当多个开发人员提交更改时,设计人员创建的代码文件(所有命名的文件TheFormName.designer.cs)都会导致很难解决的冲突.

据我所知,这是因为设计师生成的代码会在用户修改时重新安排,无论实际更改有多少.

  • 如何让这些冲突更容易解决?
  • 有没有办法告诉设计师修改代码?
  • 经验丰富的C#团队如何处理表单的并发修改?

And*_*ers 10

以下是一些尝试:

  • 使事物更加模块化.使用用户控件等组件将表单拆分为多个较小的物理文件.
  • 使用表达层设计模式(如MVP)将代码移出视图并转换为标准POCO类.
  • 最新版本的SVN允许您采用硬锁 - 使用它来避免复杂的合并方案.

希望有所帮助.

  • 一个"优雅"的方式是手工编码!;-) (3认同)

mer*_*tor 2

我不熟悉 C# 或 Windows 窗体设计器,但查看一些designer.cs我可以在网上找到的文件,它们没有特别复杂的结构。

哪些部分正在重新安排?我猜这主要是方法中属性的顺序InitializeComponent()混乱了?

如果是这种情况,您也许可以编写一个简单的脚本,按字母顺序重新排序这些行(特别是如果您从未手动编辑这些文件),并将其用作Subversion 中的预提交挂钩脚本。

嗯,对……从头开始。该部分底部的大红色框表示您不应该修改挂钩脚本中的事务。但是您也许可以找到另一种方法来在designer.cs文件被更改和提交之间运行该脚本。

编辑:

事实上,鉴于 Scraimer 对此的评论:

完全破解,但在最坏的情况下,就在合并之前,我可以对两个文件进行排序,并使合并成为简单的逐行事件......

不能让 Subversion 设置一个外部合并程序吗?我一直在使用KDiff3,它可以在执行 diff 或 merge 之前运行预处理器命令,因此您可以自动化该过程。

  • 这听起来是一个非常酷的解决方案。完全破解,但在最坏的情况下,就在合并之前,我可以对两个文件进行排序,并使合并成为简单的逐行事件......当然,这有点像通过将患者放入一个搅拌机,然后将它们放回一起。 (3认同)
  • 我实现了排序,但它很棘手,我需要修复它很多次。请记住,设计器中的项目具有树结构,并且它们的顺序遵循树结构。另外,.designer 文件中的代码是真正构建和执行的,因此,例如,当您在对 VerticalSplitter/Horizo​​ntalSplitter 控件的 3 个部分进行排序方面不够幸运/经验不足时,您的应用程序可以编译,但您可以从 splitter 获得运行时异常,抱怨分割线位置非法设置。 (2认同)