如何從Visual SourceSafe升級至Team Foundation Server 2010
1 前言
為什麼要升級?Visual SourceSafe (VSS)是微軟推出的第一個版本管控系統!當初設計的時空背景,網際網路尚未崛起,開發團隊通常是小型的,並且在同一地方進行,所以並沒有太多資料分享的問題。不過後來的15年間,網際網路改變了整個軟體架構與開發型態,開發團隊跨越國際合作已不是新鮮事,這樣的變化使得開發團隊規模變成更大,也增加了開發複雜度,例如,如何遠端存取程式碼、如何稽核程式碼、如何達成高效能、高可靠的程式碼儲存庫。
事實上,VSS已經無法符合這些現代軟體開發的需求,所以軟體推出新一代工具—Team Foundation Server (TFS),便是用於取代VSS,它有許多優點是VSS所沒有的,讓筆者一一為您介紹,你會了解最佳升級至TFS的時機就是現在!
2 Team Foundation Server優勢
2.1 效能、可靠性、可擴充性
TFS後端是使用SQL Server 2008儲存資訊,並且TFS不一定要安裝在Windows Server上,所以可適用於小型開發團隊:使用Windows 7與SQL Server Express進行單機配置,後續可依團隊規模逐步升級至Windows Server 2008與SQL Sever Enterprise等多部伺服器配置。
此外,VSS的配置有4GB的上限,一旦超過會導致檔案的損毀;而TFS由於運用SQL Server儲存資料,所以沒有這個限制,並且我們可以直接運用SQL Server內建的備份、鏡射(Mirroring)機制以確定資料的完整性與一致性。
2.2 安全性
在VSS,安全設定只有三種選擇—Admin, Read/Write與Read,若您要針對個別檔案進行控管,也能辦到,但設定步驟十分繁瑣。由於設定選擇太過簡化,一旦您擁有個別檔案的寫入(Write)權限,就能夠進行刪除動作,可能會導致檔案的遺失。TFS則提供更細膩的權限控管,例如,可以讓同仁審查(Peer Review)與外包團隊能簽出(Check-out)程式碼,但無法直接簽入(Check-in)。
2.3 進階功能
身為一個開發人員,您不只會想知道某一段程式何時被何人修改,還會想知道為什麼要這樣改,在TFS,透過附註(Annotated)功能便能達成這樣的需求,並且在TFS簽入(Check-in)時,所有相關檔案將是同時簽入(Check-in),並歸屬於同一個變更集(Changeset),如圖2:
圖1 TFS附註(Annotate)功能視窗可以依程式碼檔案顯示出每一行程式最後是何人何時更動過
圖2 變更集視窗
反觀VSS並不提供這樣的功能,假設你在VSS簽入(Check-in) 3個檔案(a.cs, b.cs, c.cs),其中有一個檔案簽入(Check-in)失敗,下次其他開發人員進行簽出(Check-out)便會取得不完整的程式碼,導致無法進行編譯與建置。
以VSS為程式碼管控伺服器的另一個問題是分支(Branching)。一來它無法視覺化展現程式碼的整體分支(Branch)結構;二來VSS使用分享(Shareing)方法來解決分支(Branch)的問題。但是分享的問題是,一旦有人修改到分享(Share)的檔案,所有相關專案全部馬上會被影響到,雖然VSS後續版本有加入了分支(Branching)功能,VSS使用者必須很清楚兩者的差異,才不會設定錯誤導致天下大亂!TFS則提供純粹的分支(Branching)模式,並沒有分享(Sharing)功能,減少專案成員犯錯的機率,並且透過如圖3所示的圖形介面上,即可直接進行合併的動作。
圖3 將分支(Branch)結構視覺化
· Bug與工作追蹤
工作項目(Work Item)是TFS另外一項重要功能,它能夠追蹤工作回溯至需求,或是用於指派工作給開發人員、回報狀態給專案經理。
· E-mail警示
TFS允許開發人員對版本管控系統裡的檔案或目錄進行E-mail警示訂閱,當訂閱的目錄有任何異動,開發人員就會收到E-mail警示通知。
· 擱置集(Shelvesets)
允許開發人員將未完成的程式碼暫時上傳至TFS暫存區,而不會影響到其他專案成員簽入(Check-in)與簽出(Check-out),好處是一是可以在TFS上留存備份;二是透過它可以分享給其他專案成員,方便進行討論。
· 自動化建置
很多團隊使用第三方產品來從VSS取得程式碼,並進行定期建置。而TFS內建建置引撃,可支援多組組態設定,並且可透過Windows WorkFlow 4.0客製建置流程。
3 VSS與Team Foundation Server使用比較
您已經了解一些升級TFS的好處,透過兩者工具的比較將對實際應用更有幫助。
圖4 Visual SourceSafe介面
圖5 Team Foundation Server介面
您可以發現兩者介面十分類似,所以VSS使用者升級至TFS時的使用障礙大大降低。另外從圖5可得知TFS介面已完全整合至Visual Studio,所以版本管控功能都能在單一環境裡執行,進而提高開發人員的效率。表1列出VSS與TFS版本管控功能比較。
操作 | VSS | TFS |
簽出(Check-out) | VSS提供兩種簽出方式,手動簽出及自動簽出。 手動簽出就是(在VSS或IDE中)對選取的檔案按右鍵選擇簽出(Check-out)。 自動簽出則是使用者直接修改程式,一旦修改到已納入版控的部份,即由VSS自動簽出。 | 完全相同。 在TFS中亦可選擇手動簽出或自動簽出。 |
簽入(Check-in) | (在VSS或IDE中)對選取的檔案按右鍵選擇簽入(Check-in),或利用暫止簽入(Pending Checkins)視窗(圖6)。 | 完全相同。 在VSS中的暫止簽入(Pending Checkins)視窗在TFS中改稱為在暫止的變更(Pending Changes)視窗(圖7)。 |
檢視歷史記錄 | (在VSS或IDE中)對選取的檔案按右鍵選擇檢視歷史記錄。 | 除了TFS中不顯現典型的對話視窗外,完全相同。 |
取得 | (在VSS或IDE中)對選取的檔案按右鍵選擇取得(Get) 。 | 對選取的檔案按右鍵選擇取得最新版本(Get Latest)。要取得某個特定版本,對其按右鍵並選擇取得特定版本(Get Specific Version),可依日期、標籤、最新或工作區版本作為過濾條件。 |
分支(Branch) | 在VSS中對要共享的目錄按右鍵選擇分享(Share to)。選擇要分享的檔案並點擊分享(Share)。勾選Recursive並點選OK即可。 | 在原始檔控制總管中對選取的檔案按右鍵選擇分支(Branching),之後選擇合併(Merging) > 分支(Branch),再點選OK即可。 |
Wildcard搜尋 | 開啟VSS並選取檢視(View) >搜尋(Search (Wildcard or Status)),再選取適當選項。 | 在原始檔控制總管中,對分支/目錄/檔案按右鍵選擇尋找版本管控(Find in Source Control (Wildcard or Status) ),之後選取適當選項。 |
比較 | 對選定檔案或檔案夾按右鍵選擇比較(Show Differences) | 完全相同。 在TFS中的menu選項名稱為比較(Compare) |
圖6 Visual SourceSafe 暫止簽入(Pending Checkins)視窗
圖7 Team Foundation Server 暫止的變更(Pending Changes)視窗
由圖6與圖7可以看出最大的差異就是TFS提供了更多功能選項(請見圖7 TFS 暫止的變更視窗左方)。除此之外,相關應用上可說是幾乎完全相同。
圖8與圖9則是同時比較了VSS和TFS在檢視記錄(History)視窗中的差異。
圖8 Visual SourceSafe 檢視記錄(History)視窗
圖9 Team Foundation Server 的檢視記錄歷史(History)視窗
可以清楚看見TFS多了許多重要功能– 在VSS對話視窗中版本(Version)的欄位,及在TFS視窗中的變更集(Changest)欄位,之前在進階功能章節中有討論過。相較於VSS中版本(Version)欄位的數字,為關聯特定檔案的唯一值(Unique),TFS變更集(Changest)欄位中的數字,則是整個專案中的唯一值,因此在TFS中,使用者不需透過變更集的時間戳(Timestamp)來決定所需版本。此外,亦可以直接透過圖9中標籤 (Labels)頁面檢視該檔案中有哪些標籤。
4 VSS中受歡迎的功能呢? (What happened to my favorite features?)
部份VSS中的功能在TFS版本中將不再提供,或以不同做法取代,玆條列於表2。其他如Sharing、Pinning等需進一步說明的功能,討論於後。
VSS功能 | 描述 | TFS版本 |
關鍵字擴展 (Keyword Expansion) | 在表頭插入placehoders (如 $Revision: $ 替換成 $Revision: 23 $ 如此你就知道這個檔案版本是編號23) | 不再提供本功能 |
唯讀 (Use Read-Only) | 允許檔案在本地端開啟時,維持在唯讀/唯寫,或僅唯讀狀態。 | 不再提供本功能 |
版本回復 (Rollback) | 允許取回先前版本 | 支援本功能但僅能透過命令指令(Command Line)執行 (TF Rollback) |
影子目錄 (Shadow Folders) | VSS中同步分享檔案內容的功能讓不能透過VSS存取的個體也可以存取程式碼檔案。 | TFS並未建置此功能,但可藉由使用任務排程及執行取得(Get)功能輕鬆複製檔案,達成和VSS影子目錄相同的效果。 |
還原模式 (Restore Mod) | 允許開發人員於檔案上設定最後簽入、簽出或開發人員從VSS取得檔案的日期/時間 標籤 | 不再提供本功能。 檔案的日期/時間標籤為由系統自動記錄,開發人員對檔案執行工作的當前時間 |
在歷史記錄執行搜尋功能 Find in Files View History | 從檔案內容中找尋特定字眼 | 不再提供本功能。 替代做法是將檔案取出(Get)到本地端,透過Windows Search或其他搜尋工具來執行搜尋功能 |
表2 Team Foundation Server與 VSS 功能比較
· Sharing
基於許多理由,TFS不支援分享(Sharing)功能,取而代之的是使用分支(Branching)功能。分享(Sharing) 是在VSS中非常受歡迎的功能,因為它不需要執行合併(Merge)且可保持自動同步檔案。相較於分支(Branching),分享(Sharing)是建立一個欲分享檔案的捷徑,讓檔案可以從另一個實體位置被存取並修改。然而,這對多組團隊在共同開發時帶來了一些嚴重的後果。
其中主要問題就是當某團隊修改了檔案時,會連帶影響其他的團隊。因為程式碼可以由開發人員逕行修改,包括修改或覆蓋掉其他開發人員已完成的部份。
在TFS中,所有分享的檔案或目錄都將被轉換成獨立的檔案:未來檔案進行修改時是以複製而非透過參考路徑取得檔案的方式。
· Pinning
像是一個傳達訊息的概念,讓其他人知道:"這是一個完成的檔案,如果你要取得目前的最新版本,就是它了"。這讓開發人員能透過Pinning標註一個已完成、可供使用的版本,以讓其他人員取得,並防止取錯。另一個Pinning的用法則是協助說明最後發行的軟體版本,是由哪些檔案版本合併而來。
在TFS中, Private Branches提供開發人員執行和Pinning相同的功能。使用Private Branches的好處在於讓許多開發人員可以各自進行編程,即擁有各自的檔案版本,待完成時再予以合併(Merge)。
5 如何從VSS移植至Team Foundation Server
移植方法有二:時間點移植與完整移植。不管您選擇那一種方式,建議還是要備份Visual SourceSafe資料庫,特別是當您使用時間移植方式時,您才能保留完整的程式碼版本記錄。
5.1 時間點移植
基本上就是從VSS取得最新程式碼版本,並將其脫離VSS程式碼管控,然後再加入 TFS程式碼管控,操作步驟如下:
· 在Visual Studio裡,首先確認您的原始檔控制程式為”Visual SourceSafe”,請至Menu -> 工具 -> 選項 -> 原始檔控制 -> 目前的原始檔控制外掛程式。
圖10 目前的原始檔控制外掛程式
· 開啓您的專案,並從VSS取得最新版本。
· 點選Menu之檔案 -> 原始檔控制 -> 變更原始檔控制,將您的專案解除繋結,此時您會發現方案總管裡的檔案鎖頭都消失了,表示已成功脫離原始檔控制。
圖11 解除專案繋結
· 接下來請將原始檔控制切換成”Team Foundation Server” (工具 -> 選項 -> 原始檔控制)。
· 在方案總管裡,對方案節點按右鍵選”將方案加入至原始檔控制”,然後選擇您的Team專案,按[確定]鈕。
圖12 將方案加入至原始檔控制
· 此時整個方案裡的所有檔案皆會出現”+”符號,表示所有檔案準備加入TFS原始檔控制,然後在方案節點按右鍵選”簽入”,以完成簽入所有檔案至TFS。
5.2 完整移植
可將VSS所有異動記錄全數移轉至TFS,移植程序會比較複雜一點:
圖13 在VSS上的版本異動記錄
· 確認VSS版本必須是2005。
· 請將VSS資料庫目錄複製一份,如C:\VSSDB,拷貝至TFS伺服器上,並確定在TFS上有安裝Team Explorer。
· 安裝KB947647,請至下列網址下載並安裝至TFS伺服器上:
http://code.msdn.microsoft.com/KB947647/Release/ProjectReleases.aspx?ReleaseId=1028
· 建立analysissettings.xml設定檔,用於設定匯入匯出相關組態,內容如下,並將其存於C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE目錄:
<?xml version="1.0" encoding="utf-8"?> <SourceControlConverter> <ConverterSpecificSetting> <Source name="VSS"> <!--設定VSS資料庫目錄--> <VSSDatabase name="c:\VSSDB_Copy"></VSSDatabase> <!--設定移植暫存目錄--> <UserMap name="c:\Migrate\Usermap.xml"></UserMap> <!--設定TFS資料庫伺服器名稱--> <SQL Server="(local)"></SQL> </Source> <ProjectMap> <!--設定專案對應關係--> <Project Source="$/" Destination="$/DemoProject/DemoVersionControl110318"></Project> </ProjectMap> </ConverterSpecificSetting> <Settings> <!--設定TFS連線資訊--> <TeamFoundationServer name="win2008test" port="8080" protocol="http" collection="tfs/DefaultCollection" ></TeamFoundationServer> <Output file="Analysis.xml"></Output> </Settings> </SourceControlConverter> |
設定專案對應關係部份可以支援多組,筆者建議從VSS專案目錄使用人員/部門來考量,因為不同開發部門,權限設定會有不同,使用的流程亦是,若可歸類為兩個主要使用部門,可在TFS建立兩個Team專案,然後將VSS專案目錄對應所屬Team專案,如下:
Source | Destination |
$\Folder 1\Project 1 | $\Team Project 1\Project 1 |
$\Folder 1\Project 2 | $\Team Project 1\Project 2 |
$\Folder 2\Project 3 | $\Team Project 2\Project 3 |
$\Folder 2\Project 4 | $\Team Project 2\Project 4 |
表3 設定專案對應關係
· 以Administrator身分開啓命令提示字元,切換至C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE目錄,然後執行下列指令:
VSSConverter.exe analyze analysissettings.xml
執行成功後會在目前目錄出現”Analysis.xml”,裡面是分析結果,若無錯誤訊息,請開啓C:\migrate\Usermap.xml,並將VSS帳號對應至TFS帳號,如下:
<?xml version="1.0" encoding="utf-8"?>
<UserMappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--這是由 VSS 轉換器自動建立的檔案。您可以選擇使用這個檔案將VSS 使用者對應到 Team Foundation 使用者。例如,<UserMap From="Jane" To="MyDomain\Janep"></UserMap> 在移轉過程中,這個對應會讓 VSS 使用者 "Jane" 記錄的所有動作,全部變成是 Team Foundation 使用者 “MyDomain\Janep”。-->
<UserMap From="Administrator" To="win2008test\administrator" />
<UserMap From="ADMIN" To="win2008test\administrator" />
</UserMappings>
· 將Analysis.xml刪除,方可重複執行VSSConverter.exe,將指令更改如下:
VSSConverter.exe migrate analysissettings.xml
若一切順利,您會在TFS之原始檔控制總管看到VSS的異動記錄。
圖14 TFS裡的原始檔異動記錄
6 結語
透過Visual SourceSafe與Team Foundation Server的相互比較,讀者對於兩者之間的差異大致能有初步了解,界面上十分接近,功能上則強化許多。TFS內建提供兩種移植方式:時間點移植與完整移植,筆者認為完整移植難度並不高,且移植後VSS就能完全停用,減輕系統管理人員維護上的負擔;對於使用者來說,可以在單一TFS查詢完整的程式碼異動記錄,使用上更加便利。
7 備註
本文內容翻譯至微軟技術白皮書: Upgrading from Visual SourceSafe to Team Foundation Server,作者: Brian Harry,內容並經過增刪修。