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