合并vcproj文件 - SCM的地狱

26

合并项目/解决方案文件是开发人员/SCM管理员在源代码控制中执行合并时的一种众所周知的灾难。

例如,常见的场景是,在两个不同的分支上开发一个项目/解决方案。当到了将其合并回主要开发线的时候,VCPROJ's (和SLNs)之间几乎没有任何相似之处。

原因是,Visual Studio 可能会改变(也确实改变)这些文件中各种类似 XML 的元素的位置。例如,配置调试和发布可能会在每次对 proj 文件进行保存操作时交换顺序。这使得很难将每个开发分支的更改轻松地合并到一起,甚至无法考虑自动合并。

我可以假设 Microsoft 正在使用某种 Perl 哈希系统来保存 vcproj 结构,因此文件在保存操作时的渲染是无序的。

首先,我想问:有人找到了一些优雅的方法来解决这个问题吗?

其次,我想提出两个建议:

  • 请 Microsoft 重新实现上述文件,并将它们限制为某种严格的元素排序。

  • 找到一个工具(或编写一个工具),按字母顺序递归地对 vcproj(xml 格式)和 sln(sln 格式...)文件进行排序(元素内的所有元素等)。在源文件和目标文件上使用此工具将使得可以轻松地指向(和合并)更改,希望 Visual Studio 读取排序后的合并项目或 sln 文件。

欢迎分享其他想法和思路。


我喜欢你的工具想法。在我看来,这似乎是一个有用的东西。也许我会试一试... - Tim
你对于解决方案文件中元素的顺序无关紧要有多有信心?比如在ProjectSection(ProjectDependencies)和GlobalSection(TeamFoundationVersionControl)部分?是否有任何公开的格式? - Mal Ross
8个回答

4
我创建了一个工具,用于比较和合并解决方案文件(http://slntools.codeplex.com)。与“通用合并工具”相比,使用此工具合并解决方案更加容易。但它无法处理项目文件。

我刚试了一下,但是当比较那些被VS和SD都编辑过的项目时,它会出现错误。 - Dmitri Nesteruk

3

Project: Merge 是我的用于比较和合并XML文件的工具。我最初编写它是因为我在使用Visual Studio项目文件时遇到了这个问题。

它能正确检测XML文件中重新排序的元素和/或属性,并几乎自动解决所有“冲突”。


1

检查安装选项 - 确保所有同事都安装了x64编译器组件(或者都没有安装)


1

你可能想考虑将你的工具与 SCM 中的触发器(例如 SVN 的重新提交钩子)关联起来,以强制在这些文件中进行重新排序。

然后你就有机会有效地将这些元素合并在一起。


1

我通常尽量避免将自动生成的文件放在版本控制中。自动生成的文件应该是由开发人员控制的源文件生成的,而这些源文件可以放在版本控制下。如果某个工具以不透明和脆弱的格式存储数据,则这是该工具的问题。

关于Visual Studio,虽然我认为它有不错的编译器、库和调试环境,但我认为它生成的文件(PRJ、SLN、RC)存在很大问题。除了您提到的问题外,它们在不同的VS版本之间也会有很多变化。因此,我们编写自己的makefile,并使用make在外部构建程序。此外,我们将资源文件分成两部分:一部分必须依赖VS进行处理,另一部分则可以使用普通编辑器进行处理。我们使用自定义领域特定语言编写高级描述,从而自动生成许多资源文件。因此,我们最小化了难以处理的更改对版本控制的影响。


1

对于资源文件(项目文件不太麻烦),我们在合并之前进行排序。我们已经在Plastic上配置了合并命令,实际上运行了一个排序程序(我们为此开发了一个不错的应用程序,如果您感兴趣,我们可以分享代码),以便在合并之前消除所有随机重定位... 希望这有所帮助。


0

0

有一个名为gyp的Google项目,它生成类似于CMake的Visual Studio解决方案和项目。该项目的一部分是用于对.sln和.vcproj文件的xml节点和属性进行排序的Python工具:pretty_sln和pretty_vcproj。您可以从http://gyp.googlecode.com/svn/trunk/tools/独立下载它们。

我只看了pretty_vcproj,它还扩展了导入到vcproj中的.vsprop文件,可能是为了比较两个vcprojs的确切内容。生成的vcproj不符合Microsoft提供的模式,但它可能会正常工作,或者可以将其更改为仅对“Configuration”和“Platform”节点进行排序,保留其他所有内容。不确定是否值得这样做,因为似乎已经有其他项目致力于规范化vcprojs...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接