Как предотвратить систематические конфликты при объединении фильтров проектов Visual C++ 2012?

Когда новые файлы добавляются в проект 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) или что-то еще?


person Laurent Couvidou    schedule 11.10.2013    source источник
comment
Что в конечном итоге пытается сделать слияние? Если это что-то вроде git, вы можете применить стратегию слияния для обработки этого случая. Короче говоря, это действительно зависит от инструмента, который выполняет слияние, и от того, как он их применяет. Кроме того, как сказал MJD, если это для контроля версий, вы можете просто не фиксировать фильтры и позволить каждому пользователю иметь свои собственные.   -  person Micah Zoltu    schedule 21.10.2013
comment
@micah-caldwell Мы используем Perforce для контроля версий, но мы не обязательно придерживаемся P4Merge для слияния. Для этой работы мы используем в основном Araxis Merge и Beyond Compare. И для не фиксации фильтров, это может быть хорошей идеей, см. мой комментарий ниже ответа MJD.   -  person Laurent Couvidou    schedule 21.10.2013
comment
Ваш ответ в конечном итоге будет зависеть от инструмента, который выполняет слияние. В случае git существует стратегия слияния, которая может быть полезна в подобных ситуациях, когда она добавляет оба, когда два добавления происходят в одном и том же месте. Возможно, у P4Merge, Beyond Compare и/или Araxis Merge есть аналогичная опция. Я рекомендую повторно задать свой вопрос конкретно для одного инструмента (или несколько вопросов, по одному для каждого инструмента), поскольку ответ будет зависеть от конкретного инструмента.   -  person Micah Zoltu    schedule 22.10.2013
comment
Я бы предпочел решение с участием Araxis Merge или Beyond Compare, но я открыт для любых предложений. Если использование git merge с Perforce выполнимо и поможет обойти эту проблему, то почему бы и нет. Я отредактировал свой вопрос соответственно.   -  person Laurent Couvidou    schedule 22.10.2013


Ответы (1)


Основываясь на этом вопросе, похоже, что фильтры не нужны для работы Visual Studio. Вы пробовали просто не фиксировать файлы фильтров, а вместо этого у каждого был свой файл? Я не использую VS, поэтому я не знаю, что делают эти файлы или какие функции не синхронизируются. Тем не менее, я обычно не рекомендую делать коммиты в конкретных файлах IDE, поскольку они обычно меняются для разных пользователей и в любом случае являются источником конфликтов.

person MJD    schedule 20.10.2013
comment
Отказ от применения фильтров на самом деле не является решением для нас. Это сделало бы всю иерархию проекта плоской, и, поскольку это довольно большой проект, результат не был бы действительно практичным для всех. Но... может быть, нам вообще не следует использовать фильтры, я где-то видел, что VS может напрямую использовать структуру папок... - person Laurent Couvidou; 21.10.2013
comment
Структуру папок можно использовать напрямую с помощью параметра "Показать все файлы" обозревателя решений. Но поскольку это не значение по умолчанию для Visual, я боюсь, что это может не работать для всего. Тем не менее, это может быть единственным реальным решением этой проблемы (помимо жизни с ней), так что +1 вам. - person Laurent Couvidou; 22.10.2013
comment
Да, и для ясности: эти фильтры удерживают виртуальную структуру папок, которая полностью отключена от реальной файловой системы. Вот почему их неиспользование приведет к выравниванию иерархии проекта, по крайней мере, при использовании режима обозревателя решений по умолчанию. - person Laurent Couvidou; 22.10.2013
comment
Я понимаю. Я не использую VS, поэтому у меня нет других решений. Извините, я не мог помочь дальше. - person MJD; 22.10.2013