忽略某些檔案 —— Git 學習筆記 05
忽略某些檔案
對於某些檔案,我們不希望把它們納入 Git 的管理,也不希望它們總出現在未跟蹤檔案列表。通常它們都是些自動生成的檔案,比如日誌檔案、編譯過程中建立的臨時檔案等。
通過.gitignore
檔案
假設我們要忽略 lib.a 檔案,那我們可以在 lib.a 所在目錄下建立一個名為 .gitignore
的檔案,在裡面列出 lib.a
使用 Windows 的同學注意了,如果你在資源管理器裡新建一個.gitignore
檔案,它會非常弱智地提示你必須輸入檔名,但是在文字編輯器(比如 Notepad++)裡“儲存”或者“另存為”就可以把檔案儲存為.gitignore
了。
除了在.gitignore
.gitignore
檔案裡可以包含一個檔名模式列表,指定哪一類檔案要忽略。格式如下:
空行會被忽略;以“#”號開頭的行可以用於註釋;
一個簡單的字面值檔名(literal filename)匹配任何目錄中的同名檔案;
目錄名由末尾的反斜線(/)標記。這能匹配同名的目錄和子目錄,但是不匹配檔案或符號連結;
支援標準的 glob 模式。glob 模式類似於 shell 所使用的簡化版正則表示式。具體來講,
*
匹配零個或更多字元,[abc]匹配方括號內的任意單個字元(在這個例子裡是a、b或c),而?
則匹配任意單個字元。在方括號中使用短劃線分隔的兩個字元(比如 [0-9])能夠匹配在這兩個字元範圍內的任何單個字元(在這個例子裡是0到9之間的任何數字)。注意*
不能匹配路徑分隔符。可以用
**
匹配巢狀的目錄,比如 a/**/z 能夠匹配 a/z、a/b/z 和 a/b/c/z 等。以
/
開頭的模式可用於禁止遞迴匹配,即只匹配當前目錄或檔案,而不匹配子目錄或子目錄下的檔案。以
!
開始的模式表示取反,即原本被忽略的目錄或檔案又被 Git 追蹤。注意:出於效能考慮,Git不會遍歷已經被忽略的目錄,因此,定義在被忽略目錄下的.gitignore
規則都是無效的。
說明:
- Git 允許在版本庫中任何目錄下有.gitignore檔案。每個檔案都隻影響該目錄及其所有子目錄。
- 對於多個
.gitignore
檔案,Git 會根據“就近原則”決定結果。簡而言之,就是當前目錄(如果當前目錄沒有被上層目錄忽略)的模式能推翻上層目錄的模式,最接近當前目錄的上層目錄的模式能推翻更上層的目錄模式。 - 忽略只對未跟蹤的檔案有效,對於已加入版本庫的檔案無效。
- 如果要停止 track 一個已經被 Git 追蹤的檔案,可以用
git rm --cached file
命令 。 - 如果想把某個被忽略的檔案加入版本控制, 而又不想修改 gitignore規則(也許改起來特別麻煩),你可以使用
git add -f file
命令。
其他規則源
除了.gitignore
檔案,Git 還有其他的規則源。通常來說,Git 會從多個可能的規則源獲取gitignore
規則來決定是否要忽略某一個具體的路徑。以下列出了各種規則源:
- 配置變數
core.excludesFile
中指定的規則 .git/info/exclude
中定義的規則.gitignore
檔案(後文會具體說明)- 從命令列輸入的規則
說明:
- 在判斷是否會忽略某個路徑時,Git 會根據上述列表中的模式以一定的順序進行模式匹配,然後根據就近優先原則決定結果(從上至下,以最後匹配上的為準)。
- 對於
.gitignore
檔案,Git 會從專案的頂級目錄開始,依次遍歷專案中的所有檔案。子目錄(如果沒有被父級目錄忽略的話)可以覆蓋父目錄中的規則。 - 在一個規則源內部,如果有多個規則匹配,以最後匹配上的為準。
以上三點,總結成一句話——就近原則。
如何選擇規則源
規則定義在哪個檔案中取決於該規則的作用域:
如果一個
gitignore
規則應該被Git追蹤,或者希望別人clone倉庫後這些規則也生效,那麼它就應該被定義在.gitignore
檔案中如果只想規則在某一個倉庫中生效,但是不需要共享給其他使用者, 那麼可以把它定義在此倉庫的
.git/info/exclude
中,這樣它不會隨clone而被複制如果你想某個規則對所有倉庫都生效,則可以配置變數
core.excludesFile
。例如$ touch ~/.gitignore $ git config --global core.excludesFile ~/.gitignore
第1行:在家目錄下面建立一個檔案
.gitignore
,其實路徑和檔名可以自選。當然你需要在這個檔案中寫點規則第2行:配置變數
core.excludesFile