We have the same problem. This is not due to the fact that they do not merge correctly due to text / binary status, but rather because of the fad of SVN merging.
Usually, if one person adds a new project to the project and commits, then the diff will look something like this:
<ClCompile Include="dir1\newfile1"> <Filter>dir1</Filter> </ClCompile>
Meanwhile, user2 adds a new file to the same filter (that is, the node folder in the decision tree):
<ClCompile Include="dir1\newfile2"> <Filter>dir1</Filter> </ClCompile>
When updating user2 they will get a conflict
<<<<< <ClCompile Include="dir1\newfile1"> ===== <ClCompile Include="dir1\newfile2"> >>>>>> <Filter>dir1</Filter> </ClCompile>
Most importantly, how do you resolve the conflict. If you use the "Use A Then B" option of your merge tool, you will get the following:
<ClCompile Include="dir1\newfile1"> <ClCompile Include="dir1\newfile2"> <Filter>dir1</Filter> </ClCompile>
which is invalid xml. Unfortunately, VisualStudio does not always complain about this (although usually it does, it seems to depend on the exact nature of the changes). This way you can get some files lost from your filters - I think in this case he will try to fix this by ending the first <CLCompile> :
<ClCompile Include="dir1\newfile1" />
This means that newfile1 will appear at the top level of the project, and not in the dir1 filter. Once you have some invalid nodes, it seems that you will begin to get more conflicts until someone fixes the project.
So, the solution to all this is that you need to inform users about the file structure when resolving conflicts, and not just blindly rely on the merge tool. You must make sure that each entry has all three lines: opening <CLCompile> or <CLInclude> , filter and end tag.
This whole problem exists only because of the quirk of xml, as the conflict affects only one or two of the three lines. If the final XML tag is on the same line as the filter, this will not happen.