VS2010 .filter文件和SVN

时间:2010-04-23 17:25:17

标签: svn visual-studio-2010

由于我们已经切换到VS2010,我们注意到一个新的.filters文件显然包含项目的过滤器结构。我们也使用subversion作为源代码控制。

不幸的是,每次我们登记时,如果有人向项目添加了文件或过滤器,我们最终会遇到合并冲突。 SVN似乎绝对无法正确合并此文件类型,即使它是基于文本的。它变得相当令人沮丧。

还有其他人在处理这个问题吗?有没有人找到解决方案?

示例冲突,编码器'a'添加whatever.txt并检入,编码器'b'添加过滤器和新的.cpp文件和更新。得到这个:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Filter Include="filter_1">
      <UniqueIdentifier>{065f6d5d-81b2-4c98-b313-dceb16c24bf2}</UniqueIdentifier>
    </Filter>
    <Filter Include="filter_2">
      <UniqueIdentifier>{85ef5151-d045-4b20-b1bf-e65d380a3cf3}</UniqueIdentifier>
    </Filter>
    <Filter Include="filter_2\sub_filter_1">
      <UniqueIdentifier>{90efdbe3-b53a-41fc-9dfb-147df5e7d7f3}</UniqueIdentifier>
    </Filter>
    <Filter Include="NewFilter1">
      <UniqueIdentifier>{8162b584-12a0-4a05-8cc5-ede4ced07ba3}</UniqueIdentifier>
    </Filter>
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="filter_2\file_3.hpp">
      <Filter>filter_2</Filter>
    </ClInclude>
    <ClInclude Include="filter_2\sub_filter_1\file_4.hpp">
      <Filter>filter_2\sub_filter_1</Filter>
    </ClInclude>
    <ClInclude Include="filter_1\file_1.hpp">
      <Filter>filter_1</Filter>
    </ClInclude>
    <ClInclude Include="filter_1\file_2.hpp">
      <Filter>filter_1</Filter>
    </ClInclude>
  </ItemGroup>
<<<<<<< .mine
  <ItemGroup>
    <ClCompile Include="whatnot.cpp">
      <Filter>NewFilter1</Filter>
    </ClCompile>
  </ItemGroup>
=======
  <ItemGroup>
    <None Include="whatever.txt" />
  </ItemGroup>
>>>>>>> .r12513
</Project>

4 个答案:

答案 0 :(得分:2)

我们遇到了同样的问题。由于文本/二进制状态,它与正确合并无关,而是因为SVN合并的怪癖。

通常,如果一个人向项目添加新文件并提交,则差异将类似于:

   <ClCompile Include="dir1\newfile1">
      <Filter>dir1</Filter>
    </ClCompile>

同时,user2将新文件添加到同一过滤器(即解决方案树中的文件夹节点):

   <ClCompile Include="dir1\newfile2">
      <Filter>dir1</Filter>
    </ClCompile>

当user2更新时,他们会发生冲突

   <<<<<
   <ClCompile Include="dir1\newfile1">
   =====
   <ClCompile Include="dir1\newfile2">
   >>>>>>
      <Filter>dir1</Filter>
    </ClCompile>

关键是你如何解决冲突。如果您使用合并工具的“使用A然后B”选项,那么您最终会得到:

   <ClCompile Include="dir1\newfile1">
   <ClCompile Include="dir1\newfile2">
      <Filter>dir1</Filter>
    </ClCompile>

这是无效的XML。不幸的是,VisualStudio似乎并不总是抱怨这一点(尽管通常会这样 - 似乎取决于变化的确切性质)。因此,您最终可能会从其过滤器中收集一些孤立的文件 - 我认为在这种情况下,它会尝试通过完成第一个<CLCompile>来修复它:

   <ClCompile Include="dir1\newfile1" />

这意味着newfile1将出现在项目的顶层而不是dir1过滤器中。一旦出现一些无效节点,似乎在某人修复项目之前,您将开始获得更多冲突。

因此,所有这一切的解决方案是,您需要让用户在解决冲突时了解文件的结构,而不是盲目地依赖合并工具。您必须确保每个条目都包含所有3行:开头<CLCompile><CLInclude>,过滤器和结束标记。

这整个问题只是因为xml的怪癖才真正存在,因为冲突只影响三行中的一行或两行。如果XML结束标记与过滤器位于同一行,则不会发生。

答案 1 :(得分:1)

它们是像Visual studio其他项目文件一样的纯xml文件 - 我不明白为什么它们应该比其他项目文件更容易受到冲突。更多

这些文件是否被视为二进制而不是文本?合并二进制文件是行不通的 - 检查svn属性以查看它们设置的mime类型(如果没有设置mime类型,你应该没问题)。如果设置了mime类型,则可能是您正在处理配置错误的automatic property

最后,人们可能不断添加+删除文件 - 如果是这样,您可能只需要更频繁地提交和更新,直到项目结束更多。

你绝对不应该svn:ignore这些文件。

答案 2 :(得分:0)

如果“.filters”文件是特定于用户配置的内容,那么它可能根本不属于Subversion。您可以使用svn:ignore属性使Subversion忽略对文件的更改:

svn propset svn:ignore '.filters' .

上面的命令将使Subversion开始忽略对名为“.filters”的文件的更改。

另一种选择是强制Subversion将“.filters”文件视为二进制文件:

svn propset svn:mime-type 'application/octet-stream' .filters

上面的命令将导致“.filters”文件被视为二进制文件,并且不会合并。

修改
既然您已经解释过“.filters”文件对于项目是必不可少的,并且问题可能是它被视为二进制而不是纯文本,解决方案是将类型设置为纯文本:

svn propset svn:mime-type 'text/plain' .filters

答案 3 :(得分:0)

我会就.vcxproj.filters文件的目的提供此信息:

当我使用Visual Studio 2010版本10.0.40219.1 SP1Rel创建C ++项目时,它会在项目文件夹中生成一个名为ReadMe.txt的文件,其中包含以下文本:

<YourProjectName>.vcxproj.filters
    This is the filters file for VC++ projects generated using an Application Wizard.
    It contains information about the association between the files in your project 
    and the filters. This association is used in the IDE to show grouping of files with
    similar extensions under a specific node (for e.g. ".cpp" files are associated with the
    "Source Files" filter).

确实,这确认了.vcxproj.filters文件管理您在解决方案资源管理器中看到的文件夹结构。