У нас такая же проблема. Это не имеет ничего общего с тем, что они не были правильно объединены из-за текстового / двоичного состояния, а скорее из-за причуды объединения 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 находится в той же строке, что и фильтр, этого не произойдет.