.gitignore文件编写规则详解

      发布在:个人笔记      评论:0 条评论

.gitignore文件是干嘛的


就是告诉 Git:这几个文件/文件夹别给我往仓库里扔


前端项目你总不能把 node_modules/ 提交上去吧?十几万个小文件,随便一个包就是几百兆。


还有 .env 这种存密钥的,你提交了就是把自己账号密码贴到网上。


基本写法


匹配规则


写法意思
*.log所有 .log 结尾的文件
debug?.logdebug1.log 行,debug10.log 不行(? 只匹配一个字符)
debug[0-9].logdebug0.logdebug9.log
/build只忽略根目录下的 build 文件夹
**/logs项目里任意位置logs 目录都忽略
node_modules/所有层级的 node_modules 目录,通杀


规则放哪儿


三种地方,按需选择:


  1. 项目根目录的 .gitignore :所有人共享,提交到仓库。90% 的情况你只需要这个。

  2. .git/info/exclude :你自己电脑上的临时忽略,不提交。比如你本地有个测试文件不想让同事看见。

  3. 全局配置 ~/.gitignore_global :所有仓库都生效。我一般把 .DS_StoreThumbs.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 addcommit.gitignore 才真正生效。

image

? 最佳实践:预防胜于治疗
 在项目第一次 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 里全是红字,看着闹心。

热门推荐