Git中忽略文件機(jī)制的.gitignore與.git/info/exclude兩種方式詳解
前言
在日常使用 Git 進(jìn)行版本控制的過(guò)程中,我們經(jīng)常會(huì)遇到一些不需要納入版本管理的文件,例如編譯產(chǎn)物、日志文件、IDE 配置、臨時(shí)數(shù)據(jù)等。為了防止這些文件被意外提交,Git 提供了靈活而強(qiáng)大的“忽略機(jī)制”(Ignore Mechanism)。
在 JetBrains 系列 IDE(如 IntelliJ IDEA、PyCharm、WebStorm 等)中,當(dāng)你在 Commit 窗口右鍵點(diǎn)擊一個(gè)未跟蹤文件時(shí),會(huì)看到兩個(gè)選項(xiàng):
- Add to .gitignore
- Add to .git/info/exclude
這兩個(gè)選項(xiàng)都能實(shí)現(xiàn)“忽略文件”的目的,但它們?cè)?strong>作用范圍、共享性、生命周期和適用場(chǎng)景上存在本質(zhì)區(qū)別。
一、Git 忽略機(jī)制概述
Git 的忽略功能基于模式匹配規(guī)則(Pattern Matching),通過(guò)指定文件路徑或通配符,告訴 Git 哪些文件不應(yīng)被視為“待跟蹤”或“待提交”的對(duì)象。這些規(guī)則不會(huì)影響已經(jīng) tracked(已納入版本控制)的文件,僅對(duì) untracked files(未跟蹤文件)生效。
Git 支持多層級(jí)的忽略配置,按優(yōu)先級(jí)從低到高依次為:
- 系統(tǒng)級(jí)忽略(通過(guò)
core.excludesFile配置) - 倉(cāng)庫(kù)級(jí)忽略(項(xiàng)目根目錄或子目錄中的
.gitignore文件) - 本地倉(cāng)庫(kù)私有忽略(
.git/info/exclude) - 命令行臨時(shí)忽略(如
git add -f強(qiáng)制添加)
其中,.gitignore 和 .git/info/exclude 是開(kāi)發(fā)者最常接觸的兩種方式,也是本文的核心討論對(duì)象。
二、.gitignore:項(xiàng)目級(jí)共享忽略規(guī)則
2.1 定義與位置
.gitignore 是一個(gè)普通文本文件,通常位于 Git 倉(cāng)庫(kù)的根目錄下,也可以存在于任意子目錄中。其作用范圍為該文件所在目錄及其所有子目錄。
例如:
my-project/
├── .gitignore ← 作用于整個(gè)項(xiàng)目
├── src/
│ └── .gitignore ← 僅作用于 src/ 及其子目錄
└── docs/
2.2 核心特性
| 特性 | 說(shuō)明 |
|---|---|
| 是否被 Git 跟蹤 | 是。.gitignore 本身可以(且通常應(yīng)該)被提交到倉(cāng)庫(kù) |
| 作用范圍 | 整個(gè)倉(cāng)庫(kù)(或子目錄),對(duì)所有克隆該倉(cāng)庫(kù)的協(xié)作者生效 |
| 共享性 | 團(tuán)隊(duì)共享。一旦提交,所有協(xié)作者都會(huì)繼承相同的忽略規(guī)則 |
| 持久性 | 持久存在于項(xiàng)目歷史中,隨代碼一起演進(jìn) |
2.3 語(yǔ)法規(guī)范(簡(jiǎn)要)
.gitignore 使用標(biāo)準(zhǔn)的 Git 忽略語(yǔ)法,支持:
- 通配符:
*,?,[...] - 目錄匹配:以
/結(jié)尾表示目錄(如build/) - 否定規(guī)則:以
!開(kāi)頭(如!important.log表示不忽略該文件) - 注釋:以
#開(kāi)頭 - 空行:被忽略
示例:
# 編譯輸出 /target/ /build/ *.class *.o # 日志文件 *.log # IDE 配置(根據(jù)團(tuán)隊(duì)約定決定是否忽略) .idea/ *.iml # 但保留特定配置 !.idea/runConfigurations/
2.4 適用場(chǎng)景
應(yīng)使用 .gitignore 的情況:
- 文件是構(gòu)建產(chǎn)物(如
node_modules/,dist/,out/,target/) - 文件是通用開(kāi)發(fā)工具生成的元數(shù)據(jù)(如
.vscode/,.idea/—— 若團(tuán)隊(duì)約定不提交) - 文件是操作系統(tǒng)或編輯器生成的臨時(shí)文件(如
.DS_Store,Thumbs.db,*.swp) - 文件是敏感信息模板(如
config.example.yaml,而非真實(shí)配置) - 忽略規(guī)則具有普適性和長(zhǎng)期性,適用于所有開(kāi)發(fā)者
最佳實(shí)踐:將 .gitignore 視為項(xiàng)目文檔的一部分,確保其內(nèi)容清晰、準(zhǔn)確、可維護(hù)。
三、.git/info/exclude:本地私有忽略規(guī)則
3.1 定義與位置
.git/info/exclude 是 Git 倉(cāng)庫(kù)內(nèi)部的一個(gè)特殊文件,位于:
<repo-root>/.git/info/exclude
注意:.git 是隱藏目錄,該文件不會(huì)被 Git 跟蹤,也不會(huì)出現(xiàn)在工作區(qū)文件列表中。
3.2 核心特性
| 特性 | 說(shuō)明 |
|---|---|
| 是否被 Git 跟蹤 | 否。該文件屬于 Git 內(nèi)部元數(shù)據(jù),永遠(yuǎn)不會(huì)被提交 |
| 作用范圍 | 僅限當(dāng)前本地倉(cāng)庫(kù)(Local Repository) |
| 共享性 | 完全私有。其他協(xié)作者無(wú)法感知或繼承這些規(guī)則 |
| 持久性 | 僅在當(dāng)前克隆副本中有效;若重新克隆倉(cāng)庫(kù),規(guī)則將丟失 |
3.3 語(yǔ)法規(guī)范
語(yǔ)法與 .gitignore 完全一致,支持相同的通配符、否定規(guī)則、注釋等。
示例:
# 僅我本地需要忽略 my-debug-notes.txt temp-data/ local-config.json # 臨時(shí)實(shí)驗(yàn)文件 experiment-*.py
3.4 適用場(chǎng)景
應(yīng)使用 .git/info/exclude 的情況:
- 文件是你個(gè)人臨時(shí)創(chuàng)建的(如調(diào)試腳本、筆記、草稿)
- 文件是你本地 IDE 的個(gè)性化配置(如你修改了
.idea/workspace.xml,但不想影響團(tuán)隊(duì)) - 你在進(jìn)行短期實(shí)驗(yàn)或測(cè)試,生成了大量臨時(shí)文件
- 你希望避免污染項(xiàng)目的
.gitignore(例如某個(gè)忽略規(guī)則只對(duì)你有意義) - 你正在處理一個(gè)你不具備寫權(quán)限的開(kāi)源項(xiàng)目,但仍想本地忽略某些文件
注意:如果你頻繁使用 .git/info/exclude,可能意味著你的工作流存在可優(yōu)化空間(如使用更規(guī)范的臨時(shí)目錄)。
四、區(qū)別對(duì)比表
| 維度 | .gitignore | .git/info/exclude |
|---|---|---|
| 文件位置 | 項(xiàng)目工作區(qū)(如 ./.gitignore) | Git 內(nèi)部(./.git/info/exclude) |
| 是否被 Git 跟蹤 | 是(可提交) | 否(永不提交) |
| 作用范圍 | 項(xiàng)目級(jí)(可遞歸子目錄) | 本地倉(cāng)庫(kù)級(jí)(全局于該倉(cāng)庫(kù)) |
| 共享性 | 團(tuán)隊(duì)共享 | 僅本地私有 |
| 持久性 | 隨項(xiàng)目歷史持久存在 | 僅在當(dāng)前克隆中有效 |
| 適用對(duì)象 | 所有協(xié)作者 | 僅當(dāng)前開(kāi)發(fā)者 |
| 典型用途 | 構(gòu)建產(chǎn)物、通用工具文件 | 個(gè)人臨時(shí)文件、本地配置 |
| IDE 支持 | 所有 Git 客戶端均支持 | 大多數(shù)客戶端支持(包括 IDEA) |
五、常見(jiàn)誤區(qū)與注意事項(xiàng)
5.1 誤區(qū)一:“加了忽略就能刪除已跟蹤的文件”
錯(cuò)誤:如果一個(gè)文件已經(jīng)被 Git 跟蹤(即曾經(jīng)被 git add 并提交過(guò)),那么即使你將其加入 .gitignore 或 exclude,Git 仍然會(huì)繼續(xù)跟蹤它。
正確做法:
# 停止跟蹤但保留本地文件 git rm --cached <file> # 或停止跟蹤整個(gè)目錄 git rm -r --cached <directory>
之后再添加忽略規(guī)則才生效。
5.2 誤區(qū)二:“.gitignore可以忽略所有文件”
錯(cuò)誤:.gitignore 僅對(duì) untracked files 有效。對(duì)于已跟蹤文件、已暫存文件、已提交文件,忽略規(guī)則無(wú)效。
5.3 優(yōu)先級(jí)問(wèn)題
Git 在判斷是否忽略一個(gè)文件時(shí),會(huì)按以下順序應(yīng)用規(guī)則(后定義的規(guī)則優(yōu)先級(jí)更高):
- 全局忽略(
core.excludesFile) - 項(xiàng)目
.gitignore .git/info/exclude- 命令行強(qiáng)制操作(如
git add -f)
因此,.git/info/exclude 可以覆蓋 .gitignore 中的規(guī)則(通過(guò)否定或更具體的匹配)。
5.4 子目錄.gitignore的作用域
子目錄中的 .gitignore 僅影響該目錄及子目錄,不會(huì)影響父目錄或其他分支目錄。這是實(shí)現(xiàn)模塊化忽略的有效手段。
六、JetBrains IDEA 中的操作建議
在 IntelliJ IDEA 的 Git Commit 窗口中:
- 若你希望團(tuán)隊(duì)所有人都忽略該文件 → 選擇 “Add to .gitignore”
- 若你僅希望自己本地忽略,且不希望影響項(xiàng)目配置 → 選擇 “Add to .git/info/exclude”
小技巧:你可以通過(guò) View → Tool Windows → Project 顯示隱藏文件,手動(dòng)編輯 .gitignore;而 .git/info/exclude 需要通過(guò)終端或文件管理器訪問(wèn)。
七、擴(kuò)展:全局忽略(Global Ignore)
除了上述兩種方式,Git 還支持全局忽略文件,適用于所有本地倉(cāng)庫(kù):
# 設(shè)置全局忽略文件路徑 git config --global core.excludesFile ~/.gitignore_global # 編輯 ~/.gitignore_global echo ".DS_Store" >> ~/.gitignore_global echo "Thumbs.db" >> ~/.gitignore_global
這適合放置操作系統(tǒng)級(jí)或個(gè)人偏好的通用忽略項(xiàng)。但 IDEA 的右鍵菜單通常不提供此選項(xiàng)。
八、最佳實(shí)踐
| 場(chǎng)景 | 推薦方式 |
|---|---|
| 團(tuán)隊(duì)通用的構(gòu)建產(chǎn)物、日志、臨時(shí)文件 | .gitignore |
| 開(kāi)源項(xiàng)目標(biāo)準(zhǔn)忽略(如 GitHub 提供的模板) | .gitignore |
| 個(gè)人臨時(shí)文件、調(diào)試輸出 | .git/info/exclude |
| 本地 IDE 配置(不確定是否共享) | 謹(jǐn)慎評(píng)估:若團(tuán)隊(duì)無(wú)統(tǒng)一規(guī)范,可用 .git/info/exclude |
| 敏感配置文件(如數(shù)據(jù)庫(kù)密碼) | 不應(yīng)提交,也不應(yīng)放在 .gitignore 中暴露路徑;應(yīng)使用環(huán)境變量或外部配置管理 |
最佳實(shí)踐
- 項(xiàng)目初始化時(shí)就創(chuàng)建
.gitignore,參考 github/gitignore 模板。 - 定期審查
.gitignore,避免過(guò)度忽略或遺漏關(guān)鍵文件。 - 不要將個(gè)人臨時(shí)文件規(guī)則加入
.gitignore,以免污染項(xiàng)目配置。 - 對(duì)于已跟蹤文件,先
git rm --cached再加忽略。 - 團(tuán)隊(duì)?wèi)?yīng)就 IDE 配置文件的處理達(dá)成一致(如是否提交
.idea/的部分子目錄)。
結(jié)語(yǔ)
理解 .gitignore 與 .git/info/exclude 的區(qū)別,不僅是掌握 Git 工具的細(xì)節(jié),更是提升團(tuán)隊(duì)協(xié)作效率與代碼倉(cāng)庫(kù)整潔度的關(guān)鍵。合理使用這兩種機(jī)制,既能保證項(xiàng)目的一致性,又能保留個(gè)人開(kāi)發(fā)的靈活性。
記住一句話:
“.gitignore 是給團(tuán)隊(duì)用的,.git/info/exclude 是給你自己用的。”
善用忽略規(guī)則,讓你的 Git 倉(cāng)庫(kù)更干凈、更專業(yè)、更高效。
到此這篇關(guān)于Git中忽略文件機(jī)制的.gitignore與.git/info/exclude兩種方式詳解的文章就介紹到這了,更多相關(guān)Git忽略文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vscode安裝rainbow-fart(鼓勵(lì)師)插件
這篇文章主要介紹了vscode安裝rainbow-fart(鼓勵(lì)師)插件的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Git報(bào)錯(cuò)error:pathspec‘XXX‘did not match any&nbs
這篇文章主要介紹了Git報(bào)錯(cuò)error:pathspec‘XXX‘did not match any file(s) known to git問(wèn)題及解決過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Gitlab實(shí)現(xiàn)合并分支代碼到主分支上
本文介紹了在GitLab項(xiàng)目中創(chuàng)建合并請(qǐng)求的過(guò)程,包括查看分支、填寫合并請(qǐng)求表單、選擇管理員和分支、提交請(qǐng)求、等待審核以及最終合并等步驟2026-04-04
2018年GitHub賬戶注冊(cè)圖文教程(github從注冊(cè)到使用)
Github是最流行的代碼庫(kù),里面存儲(chǔ)著豐富的優(yōu)秀的開(kāi)源代碼。不僅如此,作為一款免費(fèi)的代碼存儲(chǔ)利器也是流的一逼,支持各種編程語(yǔ)言,代碼顯示效果堪稱完美,可以隨時(shí)隨地查看自己記錄的筆記2018-02-02

