The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

TFS 版本控管心得筆記:如何大量更新不受版本控管的檔案

我們現在有許多專案都改用 TFS 進行版本控管,想說跟 Visual Studio 2010 整合的非常好,比較不會遇到新手上路時的問題,但事實上還是會遇到一些棘手的問題,例如說你自己在檔案總管裡對那些受 TFS 版本控管的檔案所做的任何操作 (更名、修改內容、新增檔案、刪除檔案、…),都不會反映到 Visual Studio 2010 暫止的變更 之中,所以你必須完全依賴 Visual Studio 2010 操作這些受版本控管的檔案,有時候這一點還蠻不方便的,還好我研究出了一個方法能夠在 Visual Studio 2010 裡大量更新那些不受版本控管的檔案,真的超級實用的。

在某些特殊的情況下,很有可能你的專案會在沒有受版本控管的情況下被異動,例如以下情境都很有可能讓你的版控作業變的很複雜或很麻煩,我也一一提出解決之道:

1. 你將專案交給一個外包團隊進行開發,而該團隊可能不太熟悉 TFS 或不太會使用

基本上不會用就請他們去學,自己學不會就去買書來看 ( Visual Studio 2010 Ultimate軟體工程實戰手冊軟體測試實戰 ),買書還懶得看也可叫他們去看影片 ( 邊做邊學 Visual Studio 2010 進階程式開發及程式碼品質 + 邊做邊學 程式碼管理 + Pluralsight On-Demand! Course Library ),但我想大家對於學習新知識一定有「意願」但不一定有「時間」,所以通常還沒學會就準備要上工改 Bug 了,哪有時間慢慢 K 書或看影片啊!

也正因為如此,在剛導入 TFS 的過程中經常會遇到很多挫折,但說實在的也沒辦法,該學的就是要學,否則遇到困難也是必然的過程。就我來說,我從 Subversion 轉向到 TFS 還真的很不習慣,因為透過檔案總管的 Windows Shell 介面實在太方便啦,想怎樣改就怎樣改,可以先斬後奏,到了要簽入 (Commit) 的時候 TortoiseSVN 自動會幫我比對出有哪些檔案有異動,沒異動內容的檔案自然不需要簽入(Commit),這一切都是那麼樣的直覺!

但 TFS 並不是這樣,透過 TFS 做版本控管,做什麼異動之前都要先報備,不報備就不當你有改,這兩套版本控管的管理邏輯大不相同,而這也是我之前剛導入 TFS 時最痛苦的部分,自由習慣了,真的很難受約束。

TFS 的版本控管除了可以用 Visual Studio 2010 連接 TFS 外,也可以下載免費的 Microsoft Visual Studio Team Explorer 2010 進行版本控管,如果要透過類似 TortoiseSVN 這種 Windows Shell 的介面在檔案總管理操作,也可以安裝 Team Foundation Server Power Tools 就能使用這些功能,但是 TFS 這種「修改前要先報備」的規定還是不變,所以還是有點麻煩。

還好,生命總會找到出路,我還是找到了「先斬後奏」的版本控管方法,雖然在 Check-in 的時候麻煩了一些,不過如果不常 Check-in 的話這方法還挺不錯的,有興趣的人可以繼續看下去。

 

2. 開發的人員根本沒有 Visual Studio 2010 開發工具 ( 因為 Visual Studio 2010 Express 無法連接 TFS )

微軟有一套免費的 Microsoft Visual Studio Team Explorer 2010 (Visual Studio Team 總管 2010) 可線上下載回來安裝使用,這樣才能透過此工具來存取 TFS 版本庫裡的檔案:

如果想安裝 Team Foundation Server Power Tools 的話,你也必須先安裝 Visual Studio 2010 或 Visual Studio Team Explorer 2010 才能使用!

 

3. 新手什麼都不懂,把一堆檔案透過檔案總管複製到對應目錄下,而這些檔案全部都不受控管無法簽入

我先假設你目前手邊的專案已經取得最新版,在這種情況下某人把檔案直接複製到受管控的目錄下,但是當你想 Check-in 的時候卻發生「沒有暫止的變更」情況!

這時我們可以開啟「原始檔控制總管」,並在該專案節點按下右鍵選擇「比較

在「比較」的對話框裡,「來源路徑」預設是伺服器上的路徑,「目標路徑」是你本地端的路徑,由於你將檔案複製到「目標路徑」下了,所以必須「找出」那些「只存在目標路徑」的檔案,所以必須參考下圖勾選「顯示只存在目的路徑的項目」選項:

最後就會比對出哪些「只存在目的端的檔案清單」,但是由於有許多目錄原本就不應該被 Check-in 到版本庫,像是 bin 目錄、obj 目錄、*.user、…等等,所以在列出「只存在目的端的檔案清單」時會發現有許多不相關的檔案出現,你必須找出那些真正需要的檔案並加入到版本庫中:

加完檔案之後就可以從檔案清單中看到該檔案已經有了「暫止的變更」狀態,也代表在這個時候執行 Check-in 動作就能把這些新增的檔案簽入了。

 

4. 新手什麼都不懂,從檔案總管把不要的檔案都刪除了,以為這就代表刪除成功,但其他人都還殘留檔案

被直接刪除的狀況跟上一種狀況剛好相反,操作方式一樣透過「比較」的方式處理,只是這次篩選的條件要修改為「顯示只存在來源路徑的項目」:

如果檔案不多的話,可以先選取再按滑鼠右鍵進行「標記刪除」動作:

請注意:標記刪除並不是真的從伺服器上刪除,你還必須執行 Check-in 的動作才能真正的將變更送交到 TFS 伺服器上!

 

5. 你被交代一個任務,必須批次修改檔案內容,而這個任務在 Visual Studio 2010 裡不容易做到時

假設我們需要寫一支程式動態的去修正所有專案裡的程式,例如批次加上檔頭說明或將每個程式檔案變成 UTF-8 檔案格式,這時透過 Visual Studio 2010 就不容易做到這點,所以從 Visual Studio 2010 裡面操作檔案就變的比較不務實,最理想的狀態還是另外寫一支程式或用其他工具批次來修改專案裡的所有程式,這時就可以用以下技巧來進行批次更新。

首先我們先把「整個方案」簽出:

 

簽出所有檔案,這樣才能將檔案的「唯讀」屬性取消:

這時就可以開始批次進行檔案異動的工作,做完之後如果要 Check-in 檔案,Visual Studio 2010 可無法方便的自動判斷哪些檔案改過、哪些沒改過。假設你有一萬個檔案,一次全部 Check-out 後修改了 100 個檔案,那麼你在 Check-in 的時候將會簽入「一萬個檔案」,如此一來完全失去了版本控管的價值,因為這樣的程式碼無法進行差異比對與變更追蹤。(關於這一點 SVN 就整合的比較漂亮,但缺點就是簽入時的速度覺慢,因為 SVN 必須把所有檔案都掃瞄過一次才知道哪裡有異動

這時我們一樣用「比較」工具來進行檔案的比對,而我們這次比較的目的是:找出所有「來源路徑」(伺服器端)與「目標路徑」(用戶端)之前完全相同的檔案,然後批次將這些檔案復原編輯的狀態,好讓他不要被簽入!其作法如下:

選取「顯示相同的項目」

由於要批次將這些檔案還原成未變更的狀態,我們要先按下 Ctrl + A 全選所有相同的檔案,然後按下「協調」按鈕,如下圖示:

這裡的「協調」功能主要的目的就在於批次替這些檔案做一些決定,像我們全選之後,可以參考下圖進行設定,我們只將這些「完全相同的檔案」而且「有暫止變更的檔案」來執行「復原暫止的變更」動作!

復原時他會列出所有暫止的變更檔案,但是會自動幫你把挑選的那些「完全相同的檔案」而且「有暫止變更的檔案」勾選起來,你只要放心的按下「復原變更」按鈕,這些檔案就不會再被更新到版本庫中,而是關注於那些真正有更新的檔案就好。

 

講到這裡你應該不難發現,你只要能靈活運用 TFS 的「比較」功能,其實能做的事情真的還蠻多的!

 

相關連結