VS2010 .filter файлы и SVN - PullRequest
       13

VS2010 .filter файлы и SVN

6 голосов
/ 23 апреля 2010

С тех пор, как мы перешли на VS2010, мы заметили новый файл .filters, который, очевидно, содержит структуру фильтра проекта. Мы также используем subversion в качестве нашего источника контроля.

К сожалению, каждый раз, когда мы регистрируемся сейчас, мы сталкиваемся с конфликтами слияния, если кто-то добавил файл или фильтр в проект. SVN кажется совершенно неспособным правильно объединить этот тип файла, даже если он основан на тексте. Это довольно разочаровывает.

Кто-нибудь еще имеет дело с этой проблемой? Кто-нибудь нашел решение?

Пример конфликта, кодер «a» добавляет what.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 ]

2 голосов
/ 23 августа 2013

У нас такая же проблема. Это не имеет ничего общего с тем, что они не были правильно объединены из-за текстового / двоичного состояния, а скорее из-за причуды объединения SVN.

Обычно, если один человек добавляет новый файл в проект и делает коммит, тогда diff будет выглядеть примерно так:

   <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 голос
/ 01 мая 2010

Это обычные XML-файлы, такие как файлы других проектов Visual Studio - я не понимаю, почему они должны быть более восприимчивыми к конфликтам, чем другие файлы проекта.

Эти файлы рассматриваются как двоичные, а не как текстовые? Объединение бинарных файлов не будет работать - проверьте свойства svn, чтобы увидеть, какой тип mime они установлен (если mime-тип не установлен, у вас все должно быть в порядке). Если тип mime установлен, возможно, вы имеете дело с неправильно настроенным автоматическим свойством .

Наконец, возможно, что люди постоянно добавляют + удаляют файлы - если это так, возможно, вам просто нужно фиксировать и обновлять чаще, пока проект не успокоится.

Вы определенно не должны svn:ignore эти файлы.

0 голосов
/ 12 апреля 2013

Я предложу это относительно цели файла .vcxproj.filters:

Когда я создаю проект C ++ с Visual Studio 2010, версия 10.0.40219.1 SP1Rel, он создает файл с именем 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 управляет структурой папок, которую вы видите в Solution Explorer.

0 голосов
/ 30 апреля 2010

Если файл ".filters" является чем-то конкретным для конфигурации пользователя, то он, вероятно, вообще не принадлежит Subversion.Вы можете заставить Subversion игнорировать изменения в файле, используя свойство svn: ignore:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...