.gitignore 与 .gitkeep 有什么区别
.gitignore 是 Git 原生功能,按规则忽略不想跟踪的文件;.gitkeep 只是社区约定的空文件,用来让 Git 能够提交空目录(Git 不跟踪空目录)。一个管"别跟踪",一个管"保留目录"。
两者用途相反:.gitignore 是 Git 的内置机制,告诉 Git"不要跟踪这些文件";.gitkeep 不是 Git 功能,只是社区惯例——放一个名叫 .gitkeep 的空文件来"保住"一个本来会被 Git 忽略的空目录。
.gitignore:排除文件
node_modules/
*.log
.env
dist/
- Git 原生支持,按模式匹配路径;
- 只影响未跟踪文件,已跟踪文件不受影响;
- 每个目录都可以有自己的 .gitignore,规则只作用于该目录树下。
.gitkeep:保留空目录
Git 只跟踪文件,空目录无法提交。但项目里常需要保留目录结构(如 logs/、uploads/、tmp/)。惯例做法:
mkdir logs
touch logs/.gitkeep
# 配合忽略目录内容但保留 .gitkeep
logs/*
!logs/.gitkeep
这样目录结构进了仓库,运行期产生的日志文件又不会污染版本库。
注意
- 名字叫什么都行:
.gitkeep只是流传最广的约定,用.keep、README.md(说明目录用途)效果相同,后者甚至更友好; - 如果目录里迟早会有被跟踪的文件,就不需要 .gitkeep。
常见问题(FAQ)
Q:.gitkeep 里要写内容吗?
不用,空文件即可。它的存在本身就是全部意义。
Q:为什么提交了空目录同事却看不到?
因为空目录根本没被提交——Git 不跟踪目录。必须放占位文件。
Q:全局忽略规则怎么配?
git config --global core.excludesFile ~/.gitignore_global,把 .DS_Store、.idea/ 这类个人环境文件全局排除,避免每个项目重复写。