guide

该忽略什么,该提交什么

整理忽略构建产物、依赖、缓存和机密,提交 lockfile、示例配置和团队编辑器设置的标准,以及下层 .gitignore、保留空目录和合并模板的要点。

好的 .gitignore 不以长短评判,而以标准评判。标准只有一个:新 clone 仓库的人,能否仅凭源码和配置重新得到相同的结果。 能重新生成的就忽略,无法重新生成或用于固定结果的就提交。

应当忽略的内容

类别示例原因
构建产物dist/, build/, target/, *.o, *.class可从源码重新生成
依赖安装结果node_modules/, vendor/(PHP), .venv/通过清单文件和 lockfile 重新安装
缓存与日志.cache/, .pytest_cache/, *.log, coverage/每次运行都会变化
本地环境与机密.env, *.pem, local.properties, *.tfstate因人因环境而异,或绝不能泄露
个人工具状态.DS_Store, *.swp, .idea/workspace.xml与项目无关 (建议使用全局 gitignore)

应当提交的内容

在子目录中放置 .gitignore

.gitignore 并非只能放在根目录。子目录中的 .gitignore 以该目录为基准生效,并且优先于上层文件。在 monorepo 中,如果各个包需要的规则不同,分别放在各包的目录中更易读。

repo/
├── .gitignore          # 公共:.DS_Store, .env, coverage/
├── apps/web/.gitignore # .next/, out/
└── services/api/.gitignore # target/

保留空目录

git 只跟踪文件,不保存空目录。像日志目录这样需要目录存在但要忽略其内容时,可以在目录中放一个占位文件,并用否定规则保留它。

/log/*
!/log/.keep

.keep.gitkeep 这类名称并不是 git 的官方功能,只是一种惯例,任何名称都可以。另一种方法是在该目录中放一个内容如下的 .gitignore,它会只保留自身而忽略其余内容。

*
!.gitignore

合并模板时

规则要简短具体

*.json 这样过于宽泛的规则会把配置文件也吞掉。尽可能收窄路径(/dist/),并在目录后加上末尾斜杠,以区分同名文件。在规则上方用一行注释写明原因,后来的人就能判断是否可以删除。

参考

← 上一篇为什么被忽略?用 git check-ignore 调试