Visual Studio,svn和合并.csproj和.sln文件

时间:2009-08-25 16:42:07

标签: visual-studio svn merge

任何人都有成功获得SVN合并已由两个用户编辑的Visual Studio项目(.csproj)或解决方案(.sln)文件?实施例

  1. 用户A检出项目
  2. 用户B签出同一个项目
  3. 用户A添加文件
  4. 用户A提交更改
  5. 用户B添加文件
  6. 用户B提交更改
  7. 在我看来,在步骤(6),svn,Tortoise,Ankh或其他任何应该检测到冲突并自动合并两个项目文件,或者更有可能提示用户B解决冲突。目前,当用户B签入时,我们看到用户A所做的更改已被删除,从而导致错误的构建,部署等缺少在上次签入之前添加的功能。

    由于项目文件是XML,为什么这是一个问题?我在这里错过了什么吗?我在这里搜索了档案并用谷歌搜索到了我不能再谷歌了,但还没有找到一个好的解决方案。

5 个答案:

答案 0 :(得分:32)

您认为您如何欺骗SVN执行第6步?你似乎误解了出了什么问题。 SVN永远不会从最新的工作副本 提交,因此如果没有用户B先前更新并合并用户A的更改,步骤#6将无法工作。老实说。试试吧。

我想会发生什么呢:

  1. 检查项目。
  2. B检查同一个项目。
  3. A添加文件。
  4. 提交更改。
  5. B添加了一个文件,但忘记保存项目/解决方案。
  6. B尝试提交更改并获取他应该首先更新的消息。
  7. B更新。
  8. B切换回VS. VS告诉他磁盘上的项目/解决方案发生了变化,并询问他是否想要a)从磁盘重新加载并丢失他的更改b)覆盖磁盘上的版本。
  9. B不理解,不试图理解,认为他的更改很有价值,并选择b),覆盖磁盘上的更改。
  10. B仍然没有尝试理解,因此不会将他在磁盘上的版本与最后一个提交的版本区分开来,从而错过了他覆盖了A的更改。
  11. B签入,覆盖A的更改。
  12. 我偶尔会看到这种情况发生,通常是用户B并不真正理解SVN(或CVS',FTM)的工作流程。

    所以这里有一些提示:

    除非您保存了所有内容,否则不要更新 (“文件” - >“全部保存”;对我来说,这是Ctrl + Shift + S)。如果您犯了这个错误并且卡住了,请覆盖磁盘上的更改,然后手动合并丢失的更改。 (它可能也可以将项目/解决方案文件更新回N-1版本,然后再次更新为HEAD,以便让SVN执行合并。)

    如果不检查您更改的文件 并快速 查看差异 ,请不要提交看看这些变化是否符合你的期望。

    提前提交,经常提交 。开发人员处理相同代码库的次数越多,就越有可能发生冲突。更新工作副本而不更新的时间越长,就越有可能发生冲突。由于开发人员的数量通常不在您手中,因此更新频率是您可以用来降低冲突概率的一件事。

答案 1 :(得分:2)

我是第二个sbi的回答。一种可能的解决方案是始终在Visual Studio中更新,至少如果您使用VisualSVN(我不确定AnkhSVN如何应对这种情况)。

VisualSVN将在更新操作期间阻止visual studio,并确保自动重新加载任何已更改的项目,因此用户无法忽略外部更改。

答案 2 :(得分:1)

一个相当激进但有效的解决方案是使用工具从元定义生成那些解决方案文件,然后只将元定义放在源代码控制下,而不是Visual Studio项目文件(这是合并的噩梦)。

在我的团队中,我们使用MPC来执行此操作。我们有:

  • 一堆用于项目描述的.mpc文件,
  • 用于工作区/解决方案描述的.mwc文件,
  • 一个小的.cmd来生成Visual Studio文件。

由于它们都是手工编辑的文本文件,因此我们不再遇到Visual Studio混淆所有内容的问题。

缺点是一个额外的工具,需要在添加或删除文件时重新生成解决方案文件,但也有一些额外的好处:

  • 项目配置是集中的:例如,更改编译标志是在一个地方而不是在每个项目的基础上完成的,
  • 这可以容纳多个构建系统(我们目前使用的是Visual 2003和2005,但这也适用于gcc和其他系统)。

根据我的经验,设置工具可能会有点痛苦(但这一切都取决于项目的大小和复杂程度),这显然是值得的。

请注意,MPC不是用于此目的的唯一工具。其他存在,例如CMake

答案 3 :(得分:1)

您还可以通过确保项目文件不列出项目中的每个单独文件来尝试减少冲突。这样可以避免在用户添加文件时首先更改项目文件。

您可以在项目文件中使用通配符:see MSDN

示例:

<ItemGroup>
  <Compile Include="Src\**\*.cs" />
  [...]
</ItemGroup>

令人遗憾的是,Visual Studio不鼓励这种项目设置,而是选择列出单个文件。

答案 4 :(得分:0)

这是非常乏味和令人厌烦的,所以你只需要犁过它。您有时会保留本地工作副本,因为它已添加了所有自定义项目。但是,在其他情况下,您需要合并Base解决方案中的所有新项目,以便最终得到两个解决方案文件中的所有内容。为了便于阅读,最好在添加自定义之前添加所有基础产品。

不要担心GUID的第一部分对于项目是相同的,但它是唯一的唯一部分。

Fissh