原本以為是再簡單不過的動作,卻花了兩個多小時。

故事是這樣的,有個Blah.sln,底下有兩個專案Boo.csproj及Shared.csproj,其路徑為

X:\TFS-IM\SNHT\MAIN\src\Blah.sln
X:\TFS-IM\SNHT\MAIN\src\Boo\Boo.csproj
X:\WorkRoom\WTS\Src\Shared\Shared.csproj

其中Shared專案隸屬其他解決方案且由Visual SourceSafe版控,故沒放在一起,而其中只有Boo專案CheckIn TFS,其餘未加入TFS版控。開發一段時間後,決定將Shared專案複製一份到X:\TFS-IM\SNHT\MAIN\src目錄下,於是我用檔案總管將X:\Workroom\WTS\src\Shared複製到X:\TFS-IM\SNHT\MAIN\src\Shared,在Blah.sln中移除Shared專案,重新加入X:\TFS-IM\SNHT\MAIN\src\Shared\Shared.csproj。神奇的事情發生了,VS2012彈出以下訊息:

The project that you are attempting to add to source control may cause other source control users to have difficulty opening this solution or getting newer versions of it. To avoid this problem, add the project from a location below the binding root of the other source controlled projects in the solution.

接著VS2012自動去原來的位置(WorkRoom\WTS目錄)載入Shared.csproj,完全不理會我指定的是TFS-IM路徑搬移後複本,接著,還引導建立額外的Workspace $/SNHT/Main/src/Shared對應:

以為是因為*.scc檔案被一起複製,殘留原本路徑設定造成,便將所有*.scc都刪除(這才知道有些*.scc設定了系統、隱藏、唯讀屬性,要dir /a才看得到,也一併被我殺了),但Visual Studio 2012就是有辦法記得Shared原本來自WorkRoom\WTS目錄。如果故意把WorkRoom\WTS下的Shared.csproj暫時改名,則加入TFS-IM\SNHT的Shared.csproj時會彈出專案檔案遺失錯誤,意思是VS2012堅持WorkRoom\WTS的Shared.csproj才是正宗,絕無分號! orz

修改Shared.csproj中的<ProjectGuid>沒用、出動茶包一哥ProcMon也看不出VS2012如何得知Shared.csproj原有目錄、試著清除TFS的Cache也無濟於事。最後終於試出來: 只要把Shared.csproj更名成其他名字,例如: TempShared.csproj,就不會發生跑回原目錄的狀況。由此推測,VS2012是依據Project檔案名進行比對。

 【2013-04-15更新】經多方嘗試,終於找到Visual Studio記憶專案原有路徑的來源在suo檔,將解決方案的.v11.suo檔刪除,就可重新做人囉! 以下步驟可免。

雖然有了更名鋸箭法,還是不太甘心要因此改專案名稱。最後,找到另一個奇妙的解決方法:

  • 先依VS2012的引導加入專案並建立Workspace對應(指向WorkRoom\WTS目錄)
  • 將上圖中Local Folder改到新路徑 X:\TFS-IM\SNHT\MAIN\src\Shared\
  • 此時Shared專案仍指向WorkRoom\WTS,關閉Blah.sln
  • 重新開啟Blah.sln
  • 發現Shared專案已指向X:\TFS-IM\SNHT\MAIN\src\Shared\,而Workspace中的那筆$/SNHT/MAIN/src/Shared也自行消失(猜想是與$/相對路徑一致被判定多餘而移除)

還沒完全解開謎團,但未來再遇到用這兩招頂著先。

【2013-04-15更新】經Franma提醒,Visual Studio能記憶哪個csproj屬於哪個sln、歸屬於哪個版控,而這些資訊也被儲存在sln檔
...
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "..\..\..\..\WorkRoom\WTS\Src\Shared\Shared.csproj", "{87F266F7-FB55-410D-9C7E-A03D86658E37}"
...
  SccProjectUniqueName4 = ..\\..\\..\\..\\WorkRoom\\WTS\\Src\\Shared\\Shared.csproj
  SccProjectName4 = Shared
  SccLocalPath4 = ..\\..\\..\\..\\WorkRoom\\WTS\\Src\\Shared

較正統的做法先將Shared.csproj解除版控再加入到新的解決方案,就不需要搞這些奇門盾甲囉。


Comments

# by Franma

黑大,其實那個資訊是被放在 Prj 檔中的,若只是換換位置並且重新當做新的專案簽入的話。直接去除版控管理是最快的方式。手動刪除 xml 或是用 vs 解除都可以。 可以參考這個。 http://www.dotblogs.com.tw/franma/archive/2011/02/20/21468.aspx 另外,為什麼它會自動幫您加 work space 的位置是因為您重新加入專案時會判斷 prj 是否有版控,而又剛好搬了新的位置。所以會很聰明地幫您把加上 work space

Post a comment