【问题标题】:VS2010 .filter files and SVNVS2010 .filter 文件和 SVN
【发布时间】:2010-04-23 17:25:17
【问题描述】:

自从我们切换到 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>

【问题讨论】:

  • 我将此提示添加到stackoverflow.com/questions/2538149/…
  • 在没有该文件的情况下如何共享项目结构的问题得到解答之前,我不会建议这样做。由于 .filters 文件的丢失会将整个东西变成一个平面结构,这实际上看起来是一个非常糟糕的主意。
  • 好的,我一直在关注这个话题,看看答案是什么。谢谢。
  • 我没见过这样的过滤文件,你把它们放在什么样的项目中?
  • 你能举一个你经常看到的冲突的例子吗?

标签: svn visual-studio-2010


【解决方案1】:

我们遇到了同样的问题。这与由于文本/二进制状态而没有正确合并它们无关,而是因为 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 似乎并不总是抱怨这一点(尽管它通常会——似乎取决于更改的确切性质)。因此,您最终会得到一些从过滤器中分离出来的文件——我认为在这种情况下,它会尝试通过完成第一个 &lt;CLCompile&gt; 来修复它:

   <ClCompile Include="dir1\newfile1" />

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

所以,解决这一切的方法是,你需要让用户在解决冲突时了解文件的结构,不要一味地依赖合并工具。您必须确保每个条目都包含 3 行:开始 &lt;CLCompile&gt;&lt;CLInclude&gt;、过滤器和结束标记。

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

【讨论】:

    【解决方案2】:

    它们是普通的 xml 文件,就像 Visual Studio 的其他项目文件一样 - 我不明白为什么它们应该比其他项目文件更容易受到冲突的影响。

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

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

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

    【讨论】:

    • 这个答案显示了很多希望。 auto 属性不起作用的事实并不奇怪,因为在这些东西的开头似乎有一些不是文本的时髦字符。将文件的 svn:mime-type 设置为“text/xml”并没有解决问题。让 svn 管理员尝试找到系统范围的方法,我们会尝试。
    • 如果您可以通过 http 访问您的 svn - 很常见,因为很多人使用 apache 来托管 svn - 您可以在您的网络浏览器中下载过滤器文件并检查(例如使用 firebug 或 http fiddler)是什么mime 类型文件最终得到服务。
    • 文件开头的“时髦字符”是否可以是 Unicode 字节顺序标记 (en.wikipedia.org/wiki/Byte_order_mark)?鉴于 Subversion 区分文本文件和二进制文件的方式,对于 UTF-8 或 UTF-16,BOM 应该不是问题:subversion.apache.org/faq.html#binary-files。这会导致 UTF-32 出现问题,因为其中两个字节为零。
    • 接受这个答案不是因为它解决了问题,而是它是最好的,我不得不选择一个。这是一个很好的答案,让我们走上了一些我们可能没有尝试过的道路。
    • 如果您能告诉我们更多有关您遇到的冲突类型的信息,那会有所帮助。当您没有足够的关于问题性质的信息时,就很难解决问题。
    【解决方案3】:

    如果“.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
    

    【讨论】:

    • 这是别人给出的相同答案,然后被删除。丢失项目中的过滤器会导致项目结构完全平坦,因此所有文件都显示在顶层。即使是小型项目,它也不起作用。
    【解决方案4】:

    关于.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 文件控制着您在解决方案资源管理器中看到的文件夹结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多