1. 程式人生 > >忽略某些檔案 —— Git 學習筆記 05

忽略某些檔案 —— Git 學習筆記 05

忽略某些檔案

對於某些檔案,我們不希望把它們納入 Git 的管理,也不希望它們總出現在未跟蹤檔案列表。通常它們都是些自動生成的檔案,比如日誌檔案、編譯過程中建立的臨時檔案等。

通過.gitignore檔案

假設我們要忽略 lib.a 檔案,那我們可以在 lib.a 所在目錄下建立一個名為 .gitignore 的檔案,在裡面列出 lib.a

使用 Windows 的同學注意了,如果你在資源管理器裡新建一個.gitignore檔案,它會非常弱智地提示你必須輸入檔名,但是在文字編輯器(比如 Notepad++)裡“儲存”或者“另存為”就可以把檔案儲存為.gitignore了。

這裡寫圖片描述

除了在.gitignore

裡面列出要忽略的檔名,Git 還支援一種更為豐富的機制:一個.gitignore檔案裡可以包含一個檔名模式列表,指定哪一類檔案要忽略。格式如下:

  1. 空行會被忽略;以“#”號開頭的行可以用於註釋;

  2. 一個簡單的字面值檔名(literal filename)匹配任何目錄中的同名檔案;

  3. 目錄名由末尾的反斜線(/)標記。這能匹配同名的目錄和子目錄,但是不匹配檔案或符號連結;

  4. 支援標準的 glob 模式。glob 模式類似於 shell 所使用的簡化版正則表示式。具體來講,*匹配零個或更多字元,[abc]匹配方括號內的任意單個字元(在這個例子裡是a、b或c),而?則匹配任意單個字元。在方括號中使用短劃線分隔的兩個字元(比如 [0-9])能夠匹配在這兩個字元範圍內的任何單個字元(在這個例子裡是0到9之間的任何數字)。注意

    *不能匹配路徑分隔符。

  5. 可以用**匹配巢狀的目錄,比如 a/**/z 能夠匹配 a/z、a/b/z 和 a/b/c/z 等。

  6. /開頭的模式可用於禁止遞迴匹配,即只匹配當前目錄或檔案,而不匹配子目錄或子目錄下的檔案。

  7. !開始的模式表示取反,即原本被忽略的目錄或檔案又被 Git 追蹤。注意:出於效能考慮,Git不會遍歷已經被忽略的目錄,因此,定義在被忽略目錄下的.gitignore規則都是無效的。

說明

  1. Git 允許在版本庫中任何目錄下有.gitignore檔案。每個檔案都隻影響該目錄及其所有子目錄。
  2. 對於多個.gitignore檔案,Git 會根據“就近原則”決定結果。簡而言之,就是當前目錄(如果當前目錄沒有被上層目錄忽略)的模式能推翻上層目錄的模式,最接近當前目錄的上層目錄的模式能推翻更上層的目錄模式。
  3. 忽略只對未跟蹤的檔案有效,對於已加入版本庫的檔案無效。
  4. 如果要停止 track 一個已經被 Git 追蹤的檔案,可以用git rm --cached file命令 。
  5. 如果想把某個被忽略的檔案加入版本控制, 而又不想修改 gitignore規則(也許改起來特別麻煩),你可以使用 git add -f file 命令。

其他規則源

除了.gitignore檔案,Git 還有其他的規則源。通常來說,Git 會從多個可能的規則源獲取gitignore規則來決定是否要忽略某一個具體的路徑。以下列出了各種規則源:

  1. 配置變數core.excludesFile中指定的規則
  2. .git/info/exclude中定義的規則
  3. .gitignore檔案(後文會具體說明)
  4. 從命令列輸入的規則

說明:

  1. 在判斷是否會忽略某個路徑時,Git 會根據上述列表中的模式以一定的順序進行模式匹配,然後根據就近優先原則決定結果(從上至下,以最後匹配上的為準)。
  2. 對於.gitignore檔案,Git 會從專案的頂級目錄開始,依次遍歷專案中的所有檔案。子目錄(如果沒有被父級目錄忽略的話)可以覆蓋父目錄中的規則。
  3. 在一個規則源內部,如果有多個規則匹配,以最後匹配上的為準。

以上三點,總結成一句話——就近原則

如何選擇規則源

規則定義在哪個檔案中取決於該規則的作用域:

  • 如果一個gitignore規則應該被Git追蹤,或者希望別人clone倉庫後這些規則也生效,那麼它就應該被定義在.gitignore檔案中

  • 如果只想規則在某一個倉庫中生效,但是不需要共享給其他使用者, 那麼可以把它定義在此倉庫的.git/info/exclude中,這樣它不會隨clone而被複制

  • 如果你想某個規則對所有倉庫都生效,則可以配置變數core.excludesFile。例如

    $ touch ~/.gitignore 
    $ git config --global core.excludesFile ~/.gitignore 

    第1行:在家目錄下面建立一個檔案.gitignore,其實路徑和檔名可以自選。當然你需要在這個檔案中寫點規則

    第2行:配置變數core.excludesFile

參考資料