.gitignore 如何忽略所有文件、只保留少数几个
白名单式 gitignore:先 忽略全部,再用 ! 逐个取反要保留的文件。注意目录要先用 !dir/ 放行才能保留其中文件;每行规则顺序敏感,后写的覆盖先写的。
白名单写法:第一行 * 忽略一切,然后用 ! 逐个放行。陷阱:要保留子目录里的文件,必须先放行其父目录链,否则 Git 根本不会进入被整体排除的目录。
基本结构
# 忽略一切
*
# 但保留这些
!.gitignore
!README.md
!Makefile
!src/
!src/**
嵌套目录的正确姿势
*
!docs/ # 先放行目录
docs/* # 再忽略其内容
!docs/guide.pdf # 最后放行目标文件
!docs/** 一条也可以(放行目录下所有内容),按需求选。
调试技巧
git check-ignore -v some/file.txt # 看文件命中了哪条规则(无输出=被保留)
git status --ignored # 总览哪些被忽略了
白名单模式规则微妙,写完务必用 check-ignore 抽查几个关键路径。
常见问题(FAQ)
Q:为什么 !file.txt 不生效?
父目录被整体排除了(如上面有 docs/ 而没有 !docs/)。目录一旦被整目录排除,内部取反无效——必须逐层放行。
Q:什么时候用这种白名单模式?
发布目录(只要特定产物进库)、配置模板仓库、教学用最小化仓库。日常项目还是用黑名单(忽略不需要的)更省心。
Q:和 .gitkeep 保留空目录冲突吗?
不冲突,可组合:* + !logs/ + logs/* + !logs/.gitkeep 实现"保留目录结构但忽略产物"。