.gitignore文件是干嘛的
就是告诉 Git:这几个文件/文件夹别给我往仓库里扔。
前端项目你总不能把 node_modules/ 提交上去吧?十几万个小文件,随便一个包就是几百兆。
还有 .env 这种存密钥的,你提交了就是把自己账号密码贴到网上。
基本写法
匹配规则
| 写法 | 意思 |
|---|---|
*.log | 所有 .log 结尾的文件 |
debug?.log | debug1.log 行,debug10.log 不行(? 只匹配一个字符) |
debug[0-9].log | debug0.log 到 debug9.log |
/build | 只忽略根目录下的 build 文件夹 |
**/logs | 项目里任意位置的 logs 目录都忽略 |
node_modules/ | 所有层级的 node_modules 目录,通杀 |
规则放哪儿
三种地方,按需选择:
项目根目录的
.gitignore:所有人共享,提交到仓库。90% 的情况你只需要这个。.git/info/exclude:你自己电脑上的临时忽略,不提交。比如你本地有个测试文件不想让同事看见。全局配置
~/.gitignore_global:所有仓库都生效。我一般把.DS_Store和Thumbs.db扔里面,Mac 和 Windows 的系统垃圾文件一劳永逸。
进阶操作,早晚用的上
1. 取反规则 !,小心踩坑
想忽略 logs/ 下所有东西,但保留 important.log:
logs/* !logs/important.log
看着没毛病对吧?但如果你写成 logs/ 就废了 :
logs/ # ❌ 整个目录被忽略,Git 不再遍历其内容 !logs/important.log # 永远不可能生效
⚠️ 核心原则:取反规则无法“复活”已被忽略的父目录。
当父目录被直接忽略时,Git 出于性能考虑不会进入该目录扫描,子文件的取反规则自然无效。
✅ 正确做法 :用logs/*忽略目录下的内容 (而非目录本身),这样 Git 仍会扫描该目录,取反规则才能生效。
2. 已经提交上去的文件,.gitignore 管不了
很多人上来就写 .env 进 .gitignore,结果 git status 里 .env 还在。为啥?因为你之前已经 add 过了。
解决办法:
# 移除跟踪,但本地文件保留 git rm --cached .env # 如果你手滑提交了整个 node_modules git rm -r --cached node_modules/
跑完这个,再重新 git add 和 commit,.gitignore 才真正生效。

? 最佳实践:预防胜于治疗
在项目第一次 commit 之前 就写好.gitignore。如果不确定某个文件是否已被跟踪,先用以下命令检查:git ls-files | grep <文件名>有输出说明已被跟踪,需要先
git rm --cached;没输出才是安全的。
3. 调试工具:git check-ignore
不知道哪个规则把文件忽略了?查一下:
git check-ignore -v src/test.log
输出类似:
.gitignore:3:*.log src/test.log
告诉你:第 3 行的 *.log 规则匹配到了这个文件。反过来,如果你觉得某个文件应该被忽略但没被忽略,也是用这个命令查。
想查当前目录下所有被忽略的文件:
find . -not -path './.git/*' | git check-ignore --stdin -v
node_modules 的各种写法,全网最细
这玩意儿写法多到能单开一节,因为太多人在这上面栽跟头了。
四种写法对比表
| 写法 | 匹配范围 | 是否匹配 .bin 等点文件 | 遍历行为与性能 |
|---|---|---|---|
node_modules | 所有层级 | ✅ | 目录级忽略,不进入遍历 ,性能最优 |
node_modules/ | 所有层级 | ✅ | 同上,语义更明确(推荐✅) |
node_modules/* | 所有层级 | ❌ | 通配符匹配,需逐条遍历 ,大目录显著拖慢 |
/node_modules | 仅根目录 | ✅ | 目录级忽略,仅作用于根目录 |
解读
node_modules/ 和 node_modules :日常用没区别,但建议写带 / 的。语义明确告诉别人这是文件夹,GitHub 官方模板也这么写。万一真有谁蛋疼建了个叫 node_modules 的文本文件,带 / 的规则不会误伤它。
node_modules/*(不推荐) :这一条深坑。* 在 glob 规则里不匹配以点开头的文件或文件夹 。你 node_modules/ 里的 .bin、.cache 目录全都会暴露出来,git status 里哗哗飘红,看着就烦。性能也不行,Git 得进目录遍历文件列表,node_modules 那体量你心里有数。
/node_modules :只认根目录下的 node_modules,子目录里的不管。Monorepo 项目偶尔会用,但绝大多数场景你不需要这个,直接 node_modules/ 一把梭全干掉就完了。
结论
认准 node_modules/,别加 / 前缀,别加 /* 后缀。
随手补几个模板片段
不用背,每次开新项目直接去 GitHub 搜 gitignore template,但常用的就这些:
# 依赖 node_modules/ vendor/ # 环境变量 .env .env.local .env.*.local # 构建产物 dist/ build/ out/ *.min.js # 日志 *.log npm-debug.log* yarn-debug.log* yarn-error.log* # IDE .vscode/ .idea/ *.swp *.swo # OS 垃圾 .DS_Store Thumbs.db
最后一句
.gitignore 这玩意儿早配早省心。项目初始化的时候花两分钟写好,后面一年不用管。拖到后面再补,要么已经有一堆垃圾文件提交上去了,要么 git status 里全是红字,看着闹心。
在Windows下使用git add命令把文件加入暂存区的时候出现以下警告:首先解释一下LF和CRLF的意思吧。CR代表的是回车符“\r”,LF代表的是换行符“\n”,在Windows下的换行符为CR...