項目中經常會有很多臨時文件, 如臨時的編譯中間文件, 通常這些文件不需要加入到版本控制中. 如何在提交的時候跳過這些文件? 一種辦法是很繁瑣的在 git add 的時候手動添加需要加入版本控制的文件, 這種方法不僅繁瑣也很容易犯錯.還有一個辦法就是使用 gitignore 文件.
什么是 gitignore 文件
gitignore 文件是一個普通的文本文件, 使用一定的語法過濾不需要版本控制的文件/ 文件夾 .
gitignore 文件放在何處
通常, 有三個位置存放 gitignore 文件
全局配置
全局配置負責屏蔽掉所有項目都需要過濾的文件, 如
Thumbs.db
, .DS_Store
具體位置在可以通過運行命令 git config core.excludesfile
查看
全局配置只會影響你自己
私有配置
位置在項目根目錄下的 .git/info/exclude
, 這個文件只會你影響你自己, 不會影響其他人, 也不會傳到版本控制中. 可以用來過濾一些你自己私有的文件, 比如你自己用的測試數(shù)據(jù)等
.gitignore
這個文件可以有很多個, 文件名為 .gitignore
, 通常只有一個并且放在項目根目錄內
如果你愛折騰, 也可以創(chuàng)建很多這個文件, 放在子目錄里面
這個文件會加入到版本控制中, 也會作用于本倉庫的其他用戶
多個 gitignore 文件之間的優(yōu)先級
首先 .gitignore 文件優(yōu)先級最高
其次是你的私有配置
再然后是全局配置
如果你愛折騰, 有很多個. gitignore 文件在不同文件夾里面
那么不同 .gitignore 文件之間是就近原則
例如, 在某個文件夾下 A 下面, 有很多文件 .test 后綴文件
根目錄下的 .gitignore 屏蔽了所有后綴名為 .test 的文件
但是對于這個文件夾下面的這些文件需要加入版本控制, 你有不想或者沒有權限去修改根目錄下面的 .gitignore 來添加例外規(guī)則
這個時候, 你就可以在 A 文件夾下面, 自行創(chuàng)建一個 .gitignore 來添加例外把這些文件加入到版本控制中.
哪些文件需要放入 gitignore 里
通常, 能夠通過其他文件自動生成的都不需要放入版本控制, 如編譯產生的臨時文件.
還有, 操作系統(tǒng)會創(chuàng)建自動創(chuàng)建一些文件, 如縮略圖, 這些也不需要放入版本控制
最后, 某些比較敏感的文件, 比如包含數(shù)據(jù)庫連接密碼的配置文件也不要放到公共 git 倉庫里
不過, 并不是一定如此, 還是得具體問題具體分析
我怎么判斷哪些規(guī)則該寫入那個 gitignore 文件
如果某個規(guī)則是需要共享給同一倉庫下其他用戶的, 比如過濾產生的編譯文件, 那么就寫入 .gitignore 中
如果某一個規(guī)則只需要針對一個特定的倉庫, 但是你不需要共享給其他用戶, 比如你自己用的測試數(shù)據(jù), 那就放入私有配置中
如果你想某個柜子在所有倉庫下都能過濾指定的文件, 如 Mac 下的 .DS_Store
文件, 那么就寫入到全局配置文件里面
我該如何編寫 gitignore 文件
gitignore文件中, 一行對應一條規(guī)則
- 空行被自動忽略, 可以隨便插入若干行空行, 你可以作為不同類型規(guī)則的分割線
- 以
#
開頭的規(guī)則被認為是注釋, 會被自動忽略. 如果你想過濾一個 以#
開頭的文件, 可以在#
之前加一個 反斜杠\\
, 如
# 這是注釋, 下面一條規(guī)則會過濾 #.txt 這個文件
\#.txt
- 會自動去除規(guī)則前后的空格, 如果你想要過濾文件名中頭尾含有空格的文件, 用 反斜杠
\\
將規(guī)則包裹起來, 如
# 過濾" 123.txt" 這個文件
\ 123.txt\
-
!
開頭的規(guī)則表示例外規(guī)則,會將符合規(guī)則的文件重新加入版本控制中. 不過如果某文件的某個祖先文件夾被過濾了, 是不可能通過單獨寫一條例外規(guī)則來讓這個文件重新加入版本控制中的. 如果需要過濾一個以 感嘆號開頭的文件, 需要在!
之前加上一個反斜杠\\
, 如
# 過濾所有后綴為 .a 的文件
*.a
# 但是保留 privatelib.a 文件
!privatelib.a
# 過濾 build 文件夾
build/
# 下面這句是無意義的, 因為父文件夾已經被過濾了
!build/a.class
# 過濾 "!.txt" 文件
\!.txt
- 如果規(guī)則以斜杠
/
結尾, 代表過濾掉這個文件夾及其所有子文件及子文件夾, 如
# 過濾 build 文件夾及下面所有的文件和文件夾
build/
- 普通規(guī)則, 如
# 過濾文件名為 test.txt 的文件
test.txt
# 過濾所有 .a 結尾的文件
*.a
# 過濾文件名只有一個字符的txt 文件
?.txt
# 過濾 testa.txt, testb.txt
test[ab].txt
# 過濾 testc.txt 到 testz.txt
test[c-z].txt
# 僅僅過濾項目根目錄下的 TODO 文件,不包括 /A/TODO
/TODO
# 過濾 doc/notes.txt 但不包括 doc/server/notes.txt.
# 相對路徑以當前的 .gitignore 文件為起點,
# 如果是 私有配置 或是 全局配置, 則以項目根目錄為起點
doc/notes.txt
# 過濾 package 目錄下所有的 readme.md文件
package/**/readme.md
語法這么麻煩, 有沒有現(xiàn)成的
如果你像我一樣懶, 你可以在github 提供的常用 gitignore 文件 去找找.
你只需下載你需要的文件, 然后重命名為.gitignore 放到你項目根目錄里面就行
我該在什么時候編寫 gitignore 文件
gitignore 對已經提交的文件沒有作用, 也就是說, 你不能編寫一個規(guī)則去過濾對某一個已經加入版本控制的文件
所以你應該一開始就寫 gitignore, 如果是 .gitignore, 記得在第一時間提交上去
如何添加強行將某一個被忽略的文件加入版本控制中而不用修改任何現(xiàn)存的 gitignore
如果只有一兩個被過濾的文件想要加入版本控制中, 而你又嫌棄修改 gitignore 復雜而麻煩, 你可以使用 git add -f mainlib.a
加入版本控制
總結
- gitignore 是用來過濾不想加入版本控制的文件用的
- 可以找到很多現(xiàn)成的 gitignore 文件
- 你應該盡早編寫gitignore并及時提交
參考資料
git 官方文檔: https://git-scm.com/docs/gitignore
segmentfault https://segmentfault.com/a/1190000000522997
廖雪峰的博客 : http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758404317281e54b6f5375640abbb11e67be4cd49e0000