创建新项目时,多数模板的 .gitignore 只预先列出少数忽略项,其余文件都被 Git 跟踪。另一种做法正好相反:在 .gitignore 第一行写入 *,让 Git 默认忽略仓库里的一切,再按需用 ! 规则把源码、配置文件等必须提交的内容逐一加回来。
正文
我们都经历过这种时候:正做着提交,突然发现自己一直把 .DSStore、nodemodules、IDE 配置,乃至 CLAUDE.md 这些垃圾提交进了仓库,更糟的是还混进了环境变量。接下来只能尴尬地补救:把它们加进 .gitignore,从提交历史里抹掉,并指望没人注意。
如果把这个思路倒过来呢?不再默认什么都允许、再挑着忽略,而是默认忽略一切、只放行特定文件。
一个简单 Go 项目的 .gitignore 可以写成:
*
!.gitignore
!*.go
!README.md
!go.mod
!go.sum
先来一行 * 把一切文件都忽略,再用 !.gitignore 保留 .gitignore 本身,用 !*.go 保留 Go 源文件,用 !README.md、!go.mod、!go.sum 保留说明与模块文件,想加别的文件就照这个格式写。这样,Git 只跟踪你明确允许的内容,不会再意外提交各种本地杂项。
这个办法不一定适合所有仓库或开发者,但值得当作另一种方案来试。如今项目的本地目录里塞满了杂七杂八的东西——各种 agent 文档、子目录——所以默认忽略反而可能省事,你看 typescript-go 的 .gitignore 已经需要 207 行。
顺带一提,想确认某个路径有没有被 Git 忽略,可以执行:
git check-ignore -v internal/server/server.go
当你想跟踪的文件迟迟没有出现在 Git 里,这条命令能省不少排查功夫。
评论
讨论整体偏质疑,多数人认为默认忽略所有文件是反常规且容易遗漏必要提交的风险操作,仅少数人认为该思路能解决临时文件泛滥的问题,适合特定场景。
认为默认忽略所有点文件可简化临时文件管理
- 用户可在项目中随意放置各类临时文件、工具辅助文件而无需反复维护忽略规则,只需在项目初始化时显式放开必要文件即可,有不少人认可该思路对减少点文件污染的价值(较多人)
- 该思路同样适用于 Docker 忽略规则,避免镜像体积膨胀(少数人) > 这个方案其实很适合用来处理 Docker 忽略文件,能减少镜像的冗余内容(@queezey)
认为该方案风险大于收益,更容易遗漏必要提交
- 默认忽略后用户很难通过 git status 发现新增的应提交文件,反而需要额外记忆要放开哪些文件,比直接维护常规忽略规则更容易出错(较多人)
- 是否提交文件与文件类型没有强关联,默认忽略会破坏 git status 的提示作用,还可能让人误以为 git add . 是安全的(较多人) > 这种方案的问题在于,你几乎马上就要开始做“这类文件可以放行”的判断,但文件是否该进 git 其实和文件类型没有太强的关联(@ryanbrunner)
更推荐用全局忽略、选择性提交或现有模板解决同类问题
- 编辑器、平台相关的文件应放在全局 gitignore 中,再配合 git add -p 逐段检查改动,既能避免临时文件入库,也不会遗漏必要提交(较多人)
- 直接使用 GitHub 官方维护的各语言 gitignore 模板即可覆盖绝大多数场景,无需自定义特殊规则(少数人)
- 若担心误提交,可只提交显式指定的文件,或使用 git add -p 检查改动,而非依赖默认忽略所有文件(较多人) > 你应该把编辑器和平台相关的文件放到全局 gitignore 里,然后只提交你打算提交的内容,如果你本来就会检查提交内容,这并不难(@MatthiasPortzel)
认为特定文件不应被归为垃圾
- 项目专属的 AI 代理规则文件(如 CLAUDE.md、AGENTS.md)属于项目协作必要文件,提交到仓库能帮助其他使用同类工具的开发者生成更合规的代码(少数人) > 如果项目用了代理工具且有专属规则,为什么不让其他用同类工具的人也能拿到这些规则,不然只会生成更差的代码(@flexagoon)
有价值的补充
- 该思路和安全领域的默认拒绝策略逻辑一致,类似内容安全策略先设默认拒绝再按需放行端口,也像先屏蔽所有端口再按需开放的做法(@jedschmidt、@yipinwong)
- 对于不了解项目结构的场景(如初次接触 Unity 项目配合 LFS),可以从零开始逐步添加必要文件,确认新克隆后项目可正常运行,再处理后续特殊文件的上传逻辑(@bob1029)
- 可通过自定义工具配置提交规则,作为预提交钩子或 CI 环节的检查项,强制拦截不应提交的文件或路径(@aleqs)
- 临时个人文件可放到单独的 .ignore 目录,环境变量等预期存在的文件仍正常放 .gitignore,系统级临时文件配置到全局忽略即可覆盖所有场景(@zahrevsky)