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