📦 .gitignore / .dockerignore 生成器
组合语言 (Node / Python / Go / Rust / Java / PHP / Ruby)、框架 (React / Next.js / Django / Rails / Laravel)、IDE (VSCode / JetBrains / Vim)、操作系统 (macOS / Windows / Linux) 预设,一键生成 .gitignore 或 .dockerignore。自动去重、保留注释、实时预览、复制和下载。
📝 .gitignore (预览)
# 请至少选择一个预设
📖 常见的坑
把语言、框架、IDE、操作系统的预设叠加起来,生成 .gitignore 或 .dockerignore,去掉重复行、保留注释。处理全部在浏览器内完成。但 .gitignore 只对「今后才被添加的文件」起作用——Git 已经在跟踪的文件,你写什么都不会被忽略。而最常见的误解正在于此:先提交了 .env,之后再把它加进 .gitignore,它既不会从仓库消失,也不会从历史消失。「忽略它」与「当它没发生过」是两回事。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 对已被跟踪的文件不起作用 | Git 一旦某个文件成为跟踪对象,就不再参考 .gitignore。因此,曾经提交过的 .env、node_modules、构建产物,无论你事后加多少规则,都会继续出现在差分里。而真正的问题不在眼前的工作目录,而在历史——用 git rm --cached 取消跟踪,并不会抹掉过往提交里的内容。任何人敲一下 git log -p 就能读到,而且如果你已经 push,同样的内容还留在 fork、镜像、CI 缓存以及每一份克隆里。若是公开仓库,机械化收集密钥的扫描器几分钟内就能找到——从密钥公开到被滥用的实测时间,是以分钟计的。 |
先取消跟踪:执行 git rm --cached .env,并与 .gitignore 的改动一起提交(不加 --cached 会把文件本身删掉)。目录则再加 -r。而如果其中含有机密,补救办法只有一个:轮换那把密钥。改写历史(git filter-repo)是可行的,但不要把它当作唯一措施——所有人都得重新克隆,而且它够不着别人的 fork 和你已经推送出去的对象。预防远比补救便宜:养成在 git add 之前先读 git status 的习惯,并把 gitleaks 或 git-secrets 装进 pre-commit 钩子。 |
把 .gitignore 原样当成 .dockerignore |
这两者格式相同,目的不同。.gitignore 写的是要排除在版本控制之外的东西,.dockerignore 写的是不要送进构建上下文的东西。直接互相套用会在两个方向上出问题。把构建需要的东西排除掉——dist/ 在 .gitignore 中是正确的排除项,但对于要 COPY 预构建产物的 Dockerfile 而言,它是必需的目录。反过来,该排除的却留了下来——不排除 .git/ 与 node_modules/,上下文会涨到几百 MB,构建明显变慢。而且,宿主机上安装的 node_modules 一旦进入镜像,就会混入为其他平台编译的原生模块,运行时崩溃。 |
请把两者分开来写。.dockerignore 按「只放行镜像构建所需之物」的思路来写就不会跑偏——至少要排除 .git、node_modules、.env、*.log、测试、文档、CI 配置。.env 务必加进去——它一旦进入上下文,就会被 COPY . . 烤进镜像,凡是拿到这个镜像的人都能读到。效果验证很简单:看 docker build 开头打印的上下文传输量——控制在几 MB 以内就算合适。另外,.dockerignore 只有放在构建上下文的根目录才会被读取——放进子目录是无效的。 |
| 规则并没有匹配到你以为的地方 | 写法上的细节会改变含义。不含斜杠的 build 会匹配任意层级上的 build。前面加斜杠的 /build 只匹配根目录下的,末尾加斜杠的 build/ 只匹配目录。最难察觉的是用 ! 取消排除:如果父目录已被排除,你就无法用 ! 把其中的文件找回来——Git 根本不会进入被排除的目录,你写在那里的规则连读都不会被读到。把 node_modules/ 与 !node_modules/mylib 并排写上,后者什么也不会发生。既不报错也不警告,因此它只会以「明明写了却不生效」的形式浮现。 |
拿不准就执行 git check-ignore -v <路径>。它会用一行告诉你,是哪个文件第几行的规则生效了——知不知道这条命令,排查耗时会差一个数量级。没有任何输出,就说明该路径没有被忽略。若想把目录里的某一项找回来,请排除目录的内容而不是目录本身:先写 node_modules/*,再写 !node_modules/mylib,就能如你所愿。叠加预设会让行数变多,但数量本身不是问题——问题在于出现「不知道这一行为什么存在」的状态,所以请把项目专属的行加上注释、集中放在文件末尾。 |
忽略配置并不只在一个地方。Git 会依次查看仓库的 .gitignore、子目录的 .gitignore、.git/info/exclude,以及全局配置(core.excludesFile)。如何分配有明确的判断标准:对项目里任何人都无用的东西(构建产物、依赖目录)放进仓库的 .gitignore,而只属于你自己环境的事情(编辑器配置、操作系统生成的文件、个人备忘)放进全局配置。把 .DS_Store、Thumbs.db、.idea/ 写进仓库的 .gitignore,严格来说是在把自己的环境强加给别人——不过现实中人人都这么做,团队统一口径反而摩擦更小,这也是事实。最后,Git 不跟踪空目录——若想保留 logs/ 这样的空目录,请在其中放一个名为 logs/.gitkeep 的空文件(.gitkeep 不是 Git 的功能,只是一个约定俗成的文件名)。
📖 使用方法
-
1
选择模式在上方选择 .gitignore 或 .dockerignore。.dockerignore 优先包含防镜像膨胀模式。
-
2
选择技术栈点选你使用的语言/框架/IDE/操作系统芯片,自动合并去重。
-
3
复制或下载通过预览上方按钮复制或下载为 .gitignore / .dockerignore 文件。
❓ 常见问题
.gitignore 和 .dockerignore 区别?
可以追加到现有文件?
与 github/gitignore 区别?
可以增加预设吗?
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
感谢您的反馈!
已送达运营者,将用于改进工具。