gitignore 忽略特定文件

概述

當你在 Linux 環境進行 C++ 開發的時候,每次編譯總會產生大量的目標文件,此時使用 git status 查看總會提示 Untracked files,但這些目標文件又不需要加入到倉庫進行管理,所以爲了更準確地管理源碼文件,並獲得更簡潔清晰的改動提示。你可以在項目根目錄添加一個 .gitignore 文件,並將需要忽略的文件寫到該文件中去,Git 將自動忽略這些特定文件。

比如一個典型的 C++ .gitignore 文件類似這樣子:

# Compiled object files
*.o
*.obj

此時 Git 將忽略所有以 .o 結尾或者 .obj 結尾的編譯目標文件。

當然我不建議你從頭開始編寫自己的 .gitignore 文件,因爲 github 網站已經爲我們提供了各種配置文件,你可以 git clone 下來也可以直接在線瀏覽:https://github.com/github/gitignore,根據自己的需求進行組合即可。比如你可以將 C.gitignoreC++.gitignore 組合成一個 .gitignore 來滿足項目中既有 C 代碼也有 C++ 代碼的情況。

克隆遠程 gitignore 倉庫:

git clone https://github.com/github/gitignore

用法例子

還是以 C.gitignore 爲例,講解一下 .gitignore 的用法與編寫規則:

# Prerequisites
*.d

  1. # 開頭的行代表註釋;
  2. 匹配當前目錄與子目錄下所有以 .d 結尾的文件或者文件夾;比如它將匹配 foo.dbar/foo.d 文件或 path.d/bar/path.d/ 文件夾;
  3. 空行表示不匹配任何文件,所以空行可用作分隔行提高可讀性。
*.dSYM/
*.mod*
modules.order
Module.symvers
Mkfile.old
dkms.conf
  1. 如果某一行是以右斜槓結尾,它將只匹配文件夾;換言之,*.dSYM/ 代表的意思是匹配當前目錄與子目錄下所有以 .dSYM/ 結尾的文件夾,但不匹配以 .dSYM 結尾的普通文件或軟鏈接符號;比如它只匹配 foo.dSYM/bar/foo.dSYM/ 文件夾;
  2. 匹配當前目錄與子目錄下所有包含 .mod 的文件或者文件夾;比如它匹配 .modfoo.modfoo.modulefoo.mod.d 等;
  3. 匹配當前目錄與子目錄下具體名稱的 modules.order 文件或文件夾。

接下來我們以 Autotools.gitignore 爲例,重點看看右斜槓 "/".gitignore 的匹配規則:

Makefile.in
/autoscan.log
m4/libtool.m4
  1. 不帶右斜槓,匹配當前目錄與子目錄下所有的 Makefile.in 文件或文件夾;
  2. 以右斜槓開頭,將僅匹配當前目錄下的 autoscan.log,但不匹配 foo/autoscan.log 文件;
  3. 模式當中包含右斜槓 ("/") 的話,將只匹配當前目錄下的 m4/libtool.m4,但不匹配 foo/m4/libtool.m4
  4. 歸納爲,如果模式當中包含右斜槓,將只匹配當前目錄下的文件或文件夾;因此 m4/libtool.m4 也等同於 /m4/libtool.m4 的寫法。

我們再以 CakePHP.gitignore 爲例,講解一下感嘆號 "!" 的用法:

/tmp/cache/models/*
!/tmp/cache/models/empty
  1. 忽略 /tmp/cache/models 文件夾下的所有文件;
  2. 但不忽略 /tmp/cache/models/empty 文件;
  3. ("!") 開頭的行將不會被忽略,一般用於希望忽略整個文件夾的內容,但仍有部分文件或文件夾需要更新到倉庫中的情況。
  4. 使用 "\" 能夠對 "!" 進行轉義,如 \!important.txt 匹配的是文件名以 "!" 開頭的 !important 文件。

接下來我們看看 NetBeans.gitignoreJetBrains.gitignore 關於 ("**") 雙星號的用法:

**/nbproject/private/
.idea/**/workspace.xml
  1. "**" 加上 "/" 開頭匹配所有的文件夾;
  2. 右斜槓帶上 "**" 後面再帶一個右斜槓表示匹配 0 個或任意多個文件夾;.idea/**/workspace.xml 匹配 .idea/workspace.xml.idea/foo/worksapce.xml或者 .idea/foo/bar/workspace.xml

最後我們看看一些中括號表達式的使用例子,可以參考 Actionscript.gitignoreVim.gitignoreTeX.gitignore 等:

[Bb]in/
*.py[cod]
[._]sw[a-p]
*.eledsec[1-9][0-9]
  1. [] 是定義匹配的字符範圍。比如 [a-zA-Z0-9] 表示相應位置的字符要匹配英文字符和數字;[Bb]in/ 匹配 Bin/bin/ 文件夾;
  2. 匹配 *.pyc*.pyo*.pyd
  3. 匹配以 ._ 開頭,後跟 swaswbswc...swp 的字符;
  4. 匹配最後兩位從 10 開始直到 99 的數字。

編寫規則

  • 空行不匹配任何文件;
  • "#" 開頭的行代表註釋;
  • "!" 開頭的行不被忽略;
  • 反斜槓 "\" 代表轉義;
  • 右斜槓 "/" 結尾僅匹配文件夾;
  • 以右斜槓 "/" 開頭或包含在模式中,僅匹配當前文件夾;
  • 星號 "*" 匹配任何字符;
  • 兩個星號 "**" 匹配 0 個或任意多個文件夾;
  • 中括號 "[]" 表達式定義匹配的字符範圍。

忽略規則

在 gitignore 文件中,每一行指定了一個忽略規則,當決定是否忽略一個路徑的時候,Git 通常會從多個源進行檢查,優先級從高到低:

  • 從命令行讀取可用的忽略規則;
  • 從當前目錄讀取 .gitignore 文件;
  • 讀取 Git 倉庫目錄下的 .git/info/exclude 文件;
  • 讀取 core.excludesFile 參數定義的文件,默認值是 $XDG_CONFIG_HOME/git/ignore,如果環境變量 $XDG_CONFIG_HOME 未定義或者爲空,則默認讀取 ~/.config/git/ignore 文件。

參考文檔

[1] Pro Git
[2] gitignore 官方文檔
[3] Git教程 - 廖雪峯的官方網站
[4] git help ignore
[5] man gitignore

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章