概述
當你在 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.gitignore 與 C++.gitignore 組合成一個 .gitignore
來滿足項目中既有 C 代碼也有 C++ 代碼的情況。
克隆遠程 gitignore 倉庫:
git clone https://github.com/github/gitignore
用法例子
還是以 C.gitignore 爲例,講解一下 .gitignore
的用法與編寫規則:
# Prerequisites
*.d
- 以
#
開頭的行代表註釋; - 匹配當前目錄與子目錄下所有以
.d
結尾的文件或者文件夾;比如它將匹配foo.d
,bar/foo.d
文件或path.d/
,bar/path.d/
文件夾; - 空行表示不匹配任何文件,所以空行可用作分隔行提高可讀性。
*.dSYM/
*.mod*
modules.order
Module.symvers
Mkfile.old
dkms.conf
- 如果某一行是以右斜槓結尾,它將只匹配文件夾;換言之,
*.dSYM/
代表的意思是匹配當前目錄與子目錄下所有以.dSYM/
結尾的文件夾,但不匹配以.dSYM
結尾的普通文件或軟鏈接符號;比如它只匹配foo.dSYM/
,bar/foo.dSYM/
文件夾; - 匹配當前目錄與子目錄下所有包含
.mod
的文件或者文件夾;比如它匹配.mod
,foo.mod
,foo.module
,foo.mod.d
等; - 匹配當前目錄與子目錄下具體名稱的
modules.order
文件或文件夾。
接下來我們以 Autotools.gitignore 爲例,重點看看右斜槓 "/"
在 .gitignore
的匹配規則:
Makefile.in
/autoscan.log
m4/libtool.m4
- 不帶右斜槓,匹配當前目錄與子目錄下所有的
Makefile.in
文件或文件夾; - 以右斜槓開頭,將僅匹配當前目錄下的
autoscan.log
,但不匹配foo/autoscan.log
文件; - 模式當中包含右斜槓
("/")
的話,將只匹配當前目錄下的m4/libtool.m4
,但不匹配foo/m4/libtool.m4
; - 歸納爲,如果模式當中包含右斜槓,將只匹配當前目錄下的文件或文件夾;因此
m4/libtool.m4
也等同於/m4/libtool.m4
的寫法。
我們再以 CakePHP.gitignore 爲例,講解一下感嘆號 "!"
的用法:
/tmp/cache/models/*
!/tmp/cache/models/empty
- 忽略
/tmp/cache/models
文件夾下的所有文件; - 但不忽略
/tmp/cache/models/empty
文件; - 以
("!")
開頭的行將不會被忽略,一般用於希望忽略整個文件夾的內容,但仍有部分文件或文件夾需要更新到倉庫中的情況。 - 使用
"\"
能夠對"!"
進行轉義,如\!important.txt
匹配的是文件名以"!"
開頭的!important
文件。
接下來我們看看 NetBeans.gitignore 與 JetBrains.gitignore 關於 ("**")
雙星號的用法:
**/nbproject/private/
.idea/**/workspace.xml
- 以
"**"
加上"/"
開頭匹配所有的文件夾; - 右斜槓帶上
"**"
後面再帶一個右斜槓表示匹配 0 個或任意多個文件夾;.idea/**/workspace.xml
匹配.idea/workspace.xml
,.idea/foo/worksapce.xml
或者.idea/foo/bar/workspace.xml
;
最後我們看看一些中括號表達式的使用例子,可以參考 Actionscript.gitignore,Vim.gitignore 或 TeX.gitignore 等:
[Bb]in/
*.py[cod]
[._]sw[a-p]
*.eledsec[1-9][0-9]
[]
是定義匹配的字符範圍。比如[a-zA-Z0-9]
表示相應位置的字符要匹配英文字符和數字;[Bb]in/
匹配Bin/
與bin/
文件夾;- 匹配
*.pyc
,*.pyo
及*.pyd
; - 匹配以
.
或_
開頭,後跟swa
,swb
,swc...swp
的字符; - 匹配最後兩位從
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