在公司混得愈久,沾染的專案就愈多(講得好像專案是髒東西一樣,咦,不是哦?),每回改程式查程式的第一步就是從 TFS Get Latest 取回最新版本,日積月累留下後遺症。不知從何時起,Visual Studio 中只要是與 TFS 有關的操作都如老牛拖車,讓我有想爆粗口的衝動(大家都知道,我性急如王藍田呀),最近發現,輸出視窗還冒出以下警告:

TF401190: The local workspace MyComputerName;Jeffrey has 177924 items in it, which exceeds the recommended limit of 100000 items. To improve performance, either reduce the number of items in the workspace, or convert the workspace to a server workspace.

Visual Studio 好心提醒,本機工作區(Local Workspace)裡的項目不宜超過 10 萬筆,否則將衝擊效能,而我的工作區已經累積了近 18 萬個項目啊啊啊啊~

爬文找到的兩個解決方向:1.改用伺服器工作區(Server Workspace)。2.將單一肥大的本機 Workspace 拆成多個。參考文章:

本機工作區允許離線簽出、新增刪除、更名,追蹤更動項目再一次簽入,不用連上 TFS 也能工作,應用起來較輕巧靈活,效率也好。也因如此,本機工作區必須有一套機制監控追蹤 TFS 列管的項目是否被修改過,當追蹤目標數量過於龐大,效能就會變差,這就是本機工作區項目不宜超過 10 萬筆的理由。

我無法接受改用綁手綁腳的伺服器工作區(雖然其上限可達一千萬筆),拆成多個工作區則會增加管理及使用複雜度。仔細想想,我真的需要在本機工作區放入那麼多項目?其實不然。工作區中不少專案項目屬臨時性支援性質,或是路過被抓公差才抓回來的,查完問題修好 Bug 加入功能上線後,幾年內甚至這輩子都不會再去碰它,但從 TFS Get Latest 取回檔案開始,只要狀態由 Not downloaded 變成 Latest 項目就被列管,造成項目數量不斷創新高。刪除本機檔案 TFS 只會註記你要刪除等你 Check In,也無法減少數量。降低本機工作區數量的最有效方法,是將資料夾或檔案狀態還原回 Not downloaded,但操作介面沒提供這個功能選項。

在 Stackoverflow 找到密技一則:Delete Local Folder in TFS - Stack Overflow

在 TFS Source Control Explorer使用 Get Specific Version 功能,類別選 Changeset,Changeset 代碼欄則輸入神奇數字 1,下方兩個複選選項打勾,按下 Get 鈕:

之後神奇的事會發生,資料夾或檔案狀態由 Latest 回到 Not downloaded 了! (Get Specific Version 過程如遇本機檔案與版控不同,還是會跳出排除衝突的操作介面)

不過,另外一個問題來了。十幾萬筆工作區檔案,資料夾結構一層一層又一層,我要怎麼知道去哪些地方移除不需要的檔案?

在 Stackoverflow 找到一則討論,發現用 TFS SDK 可以抓出伺服器工作區項目數量,參考官方文件,我寫出一支列舉本機工作區所有檔案路徑的小工具。

專案要參照 Microsoft.TeamFoundation.Client 及 Microsoft.TeamFoundation.VersionControl.Client:

程式範例如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace ListWorkspaceItems
{
    class Program
    {
        static void Main(string[] args)
        {
            var uri = new Uri("httq://TFS主機/tfs/集合名稱");
            var tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(uri);
            var vcs = tpc.GetService<VersionControlServer>();
            var workspace = vcs.GetWorkspace("X:\\工作區資料夾");
            var items = workspace.GetItems(
                new [] {new ItemSpec("$/", RecursionType.Full)}, 
                DeletedState.Any, 
                ItemType.File,
                false,
                GetItemsOptions.LocalOnly | GetItemsOptions.Unsorted);
            var files = items.First().Items.Select(o => o.LocalItem).OrderBy(o => o);
            System.IO.File.WriteAllText("E:\\TFS-Files.txt", string.Join("\n", files.ToArray()));

        }
    }
}

依據產生的清單,一一找出短期不再使用的項目用前述密技將狀態還原回 Not downloaded。另外我發現一些不慎簽入的 NuGet packages 資料夾,檔案項目數量驚人,是火上加油的大幫兇。

歷經一番清理,TFS 本機工作區項目超過 10 萬筆警示消失,而 Visual Studio 的 TFS 相關操作瞬間輕巧起來,渾身肥油的痴呆胖子變成身手敏捷的結實男,感覺超爽。搬開工作路上的大石頭,又可以全速前進!

While the number of TFS workspace items grows, the performance is getting worse. This article demostrates how to use "Get Changeset 1" trick to remove items from local workspace to speed up version-control operation.


Comments

# by 小菜鳥

目前Visual Studio也可以透過 Team Explorer > 原始檔控制總管 > 右鍵 > 進階 > 取得特定的版本 > 類型選擇變更集 就可以找到一樣的介面(中文)了~~

# by x2009again

移除映射不就可以了么?

Post a comment