Когда новые файлы добавляются в проект Visual C++, среда IDE добавляет их в два места:
- Основной файл проекта (например, myproject.vcxproj)
- Проект «фильтры», репозиторий виртуальных путей обозревателя решений (например, myproject.vcxproj.filters)
Объединение добавленных файлов не является проблемой для основного файла проекта, но очень часто является источником конфликтов для фильтров. Проблема возникает из-за того, что IDE всегда добавляет новые элементы в самый конец списка фильтров.
Чтобы проиллюстрировать проблему, предположим, что изначально фильтры выглядят так:
1 <ClInclude Include="fs\path\oldFile1.h">
2 <Filter>virtual\path</Filter>
3 </ClInclude>
4 <ClInclude Include="fs\path\oldFile2.h">
5 <Filter>virtual\path</Filter>
6 </ClInclude>
Затем программист А добавляет newFileA.h и фиксирует, фильтры обновляются следующим образом:
1 <ClInclude Include="fs\path\oldFile1.h">
2 <Filter>virtual\path</Filter>
3 </ClInclude>
4 <ClInclude Include="fs\path\oldFile2.h">
5 <Filter>virtual\path</Filter>
6 </ClInclude>
7 <ClInclude Include="fs\path\newFileA.h">
8 <Filter>virtual\path</Filter>
9 </ClInclude>
Если программист Б также добавит newFileB.h и заметит, что он синхронизируется с ревизией головы, его локальная копия фильтров будет выглядеть так:
1 <ClInclude Include="fs\path\oldFile1.h">
2 <Filter>virtual\path</Filter>
3 </ClInclude>
4 <ClInclude Include="fs\path\oldFile2.h">
5 <Filter>virtual\path</Filter>
6 </ClInclude>
7 <ClInclude Include="fs\path\newFileB.h">
8 <Filter>virtual\path</Filter>
9 </ClInclude>
Попытка синхронизироваться с изменениями программиста А будет систематически вызывать конфликт слияния в строках 7-8-9 для программиста Б. Это потому, что изменения происходят в одном и том же месте.
Есть ли способ предотвратить возникновение этой проблемы, будь то изменение конфигурации в Visual Studio, специальный параметр какого-либо инструмента слияния (предпочтительно Araxis Merge или Beyond Compare) или что-то еще?