﻿# 如何在 Visual Studio 2012 控制 TFS 版控時要忽略哪些檔案

幾乎在任何一種版本控管的機制裡，都會遇到那些「不應該簽入到版本庫」的潛規則，以往我們在用 SVN 的時候，我就寫過[幾篇文章](/post/2012/03/30/Do-not-commit-these-file-type-into-subversion-repository-2.aspx)要大家注意這點。最近都改用 TFS 做版控，因為大多使用 Visual Studio 作為主要開發工具，那些不需要的檔案被簽入 TFS 的機率大幅降低。但是，任何可能會發生的問題總是會發生 ([墨菲定律第一條](https://zh.wikipedia.org/wiki/%E6%91%A9%E8%8F%B2%E5%AE%9A%E7%90%86))，前陣子就真的有人把一堆不該簽入的檔案都簽入到 TFS 裡，不緊緊導致空間浪費，更進一步影響其他人建置專案，因此有在使用 TFS 的人還是必須注意一下。

首先，我們先來看看問題是怎樣發生的：

在 Visual Studio 2012 裡面進行版本控管，只要方案中所有專案的專案檔 ( \*.csproj 或 \*.vbproj ) 只要出現在檔案清單中的那些檔案，預設都會被加入到 TFS 版本庫裡，也代表著所有沒出現在檔案清單中的檔案，預設也會被排除在外，例如常見的 bin、obj 目錄，或是 **\*.csproj.user** 使用者環境定義檔等等。

不過，在簽入檔案時，雖然有許多檔案**沒有列在專案檔**中，但這些檔案的確存在**檔案總管**理，至於要不要加入版控，就因人而異了，全看專案的需求而定。然而，也是因為這樣，導致初學者真的很難判斷，到底這些檔案應不應該加入到版本控管裡？若遇到「熱心」的開發人員，這些檔案就會進入版本控管中！

這些尚未被加入到原始碼控管行列中的檔案，預設在 Visual Studio 2012 都會被自動**偵測**出來，並置於如下圖標示的位置。這些檔案並不屬於**排除的變更**，而是被偵測出來也許可以加入到版控的檔案清單：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/727910885188346bfc74-image_1972.png)

當你把這些檔案選取，並且按下 “**升級**" 按鈕，這些檔案就會被自動加入到 TFS 版本控制裡，直到你執行簽入動作 (Check-in)，這些檔案就會進入到 TFS 版本控管裡。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0c5c541332442b7f444e-image_1973.png)

要徹底解決這個問題，避免新手**誤加**了這些檔案進 TFS，你可以參考以下步驟：

1\. 先從 Visual Studio 2012 開啟這些自動偵測出來的檔案清單，按下 **Ctrl+A** 全選後，按下滑鼠右鍵，然後點擊「**忽略這些本機項目**」，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/79244452fbb5007396e3-image_1974.png)

2\. 這時你會看到在「**包含的變更**」中，多出了一個 **.tfignore** 檔案，而且在「**排除的變更**」裡也看不到**偵測到**的檔案了。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a954ff6d14ab75721f8c-image_1975.png)

3\. 你可以用滑鼠雙擊 **.tfignore** 這個檔案，查看其內容，這個檔案會列出你剛剛設定「**忽略這些本機項目**」的檔案清單，不過還可以再優化忽略清單的內容：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5c47ee8b04c6b36c884d-image_1976.png)

以我這次示範的例子來說，這裡的 **packages** 目錄是 NuGet 存放 NuGet 套件的目錄，照理說可以不用放進版本控管，因為你只要在 Visual Studio 2012 裡設定**啟用 NuGet 套件還原**，就可以自動還原這些檔案，以減少版本控管的空間占用。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/64a1d1b6b0ce8d130059-image_1977.png)

※ 相關文章請參考【[NuGet 1.6 提供的新功能：啟用 NuGet 套件自動回復](/post/2012/03/12/Using-NuGet-Without-Checking-In-Packages-Package-Restore.aspx)】與【[NuGet 教學影片](http://youtu.be/NuWXLKKjiv4?t=5m50s)】。

不過，用過的人一定知道，NuGet 套件會不斷更新，因此，如果要像這樣設定「**忽略這些本機項目**」的話，你不就每次更新 NuGet 套件都要再設定一次「**忽略這些本機項目**」，這太麻煩了！因次我們可以利用萬用字元 (Wildcard characters) 幫你把眾多忽略項目的設定濃縮成一個。以我們剛剛圖片上看到的例子，最後我們可以把內容濃縮到只剩下一行而已，如下：

```
\Web\packages\*
```

但是，我們又不是所有 packages 目錄下的所有檔案都要加入忽略清單，因為在 NuGet 套件管理員裡，**packages\\repositories.config** 這個檔案是應該要加入版控的！

若要忽略 **\\Web\\packages** 資料夾下的所有檔案與目錄，但保留 **\\Web\\packages\\repositories.config** 檔案的話，此時你可以將 .tfignore 檔案的內容修改成如下：

```
\Web\packages\*
!\Web\packages\repositories.config
```

只要加入一個驚嘆號 ( ! )，就可以從**忽略清單**中**排除**此條件。

除此之外，我額外再分享一個加入**忽略清單**的小技巧，因為我們都會安裝 [Elmah](https://code.google.com/p/elmah/) 來收錄 ASP.NET 網站執行過程中各種例外狀況，這些含有錯誤紀錄的 XML 檔都會儲存在 **App\_Data\\Elmah.Errors** 目錄裡，所以當在開發環境中也收錄到這些錯誤時，也切記不要加入到 TFS 版控之中，為了避免有人不小心加入，將這些錯誤紀錄的檔名規則加入到 **.tfignore** 檔案中也是有必要的，以下是加入範例，僅供參考：

```
\Web\WebSite\App_Data\Elmah.Errors\error-*.xml
```

**相關連結**

-   [自訂版本控制要忽略哪些檔案 - 將檔案加入至伺服器](http://msdn.microsoft.com/zh-tw/library/ms245454.aspx#tfignore)
-   [The Will Will Web |  All posts tagged 'NuGet'](/?tag=/NuGet)
-   [How to ignore files/directories in tfs?](http://stackoverflow.com/questions/922798/how-to-ignore-files-directories-in-tfs)
-   [elmah - Error Logging Modules and Handlers for ASP.NET - Google Project Hosting](https://code.google.com/p/elmah/)
-   [請勿將某些檔案類型的檔案簽入到 Subversion 版本庫 (二版)](/post/2012/03/30/Do-not-commit-these-file-type-into-subversion-repository-2.aspx)
