4

當新的文件添加到Visual C++項目時,IDE將其添加在兩個位置:如何在合併Visual C++ 2012項目篩選器時防止系統衝突?

  • 主項目文件(如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> 

試圖與程序員A的變化同步將有系統地引起對程序員B的第7-8-9行的合併衝突。這是因爲變化發生在同一地點。

有沒有辦法來防止這個問題的發生,無論是通過在Visual Studio中的配置變化,一些合併工具(最好 Araxis合併或超越比較),或其他任何東西的一個特殊的選項?

+0

什麼是最終嘗試合併?如果它像git那麼你可以應用合併策略來處理這種情況。簡而言之,它確實取決於正在進行合併的工具以及它如何應用它們。另外,正如MJD所說,如果這是版本控制,您可以選擇不提交過濾器,並讓每個用戶都擁有自己的過濾器。 –

+0

@ micah-caldwell我們使用Perforce進行版本控制,但我們不一定堅持使用P4Merge進行合併。我們主要使用Araxis Merge和Beyond Compare來完成這項工作。對於* not *提交過濾器,這可能是一個好主意,請參閱我的評論[MJD's answer下面](http://stackoverflow.com/a/19474105/1005455)。 –

+0

您的答案最終取決於合併的工具。在git的情況下,有一個合併策略,可以在這種情況下有用,在這種情況下,當兩個添加發生在同一個地方時,它會添加這兩個策略。 P4Merge,Beyond Compare和/或Araxis Merge有可能有類似的選擇。我建議重新詢問你的問題,專門爲一個工具(或多個問題,每個工具一個),因爲答案將是工具特定的。 –

回答

1

基於this question,它聽起來像過濾器是沒有必要的Visual Studio的功能。你有沒有嘗試過不提交你的過濾文件,而是讓每個人都有自己的文件?我不使用VS,所以我不知道這些文件是做什麼的,或者什麼功能不會被同步。但是,我通常不建議在IDE特定的文件中提交,因爲它們通常會針對不同的用戶進行更改,並且無論如何都只是衝突的來源。

+0

不提交過濾器對我們來說並不是真正的解決方案。這樣做會使整個項目的層次結構變得平坦,因爲這是一個非常大的項目,結果對每個人都不是很實際。 Buuut ...也許我們不應該使用過濾器,我已經看到VS能夠直接使用文件夾結構... –

+0

可以直接使用文件夾結構[通過Show All Files選項解決方案資源管理器](http://stackoverflow.com/a/15678083/1005455)。但是,因爲這不是Visual的默認設置,所以我擔心這可能不適用於所有內容。儘管如此,這可能是解決這個問題的唯一真正的解決方案(除此之外),所以+1。 –

+0

哦,要清楚的是:這些「過濾器」所做的是,它們擁有一個與實際文件系統完全斷開連接的虛擬文件夾結構。這就是爲什麼不使用它們會使項目層次結構變平的原因,至少在使用解決方案資源管理器的默認模式時。 –