如何向 Git 仓库提交空目录
Git 不跟踪空目录,惯例做法是在目录里放一个 .gitkeep 空文件再提交;如果目录内容应被忽略,配合 .gitignore 写 logs/ 与 !logs/.gitkeep 两条规则,保留目录结构同时忽略产物。
Git 从设计上就不跟踪空目录(它只跟踪文件),惯例解法是在目录里放一个占位文件——社区通称 .gitkeep——然后正常提交。目录内容需要忽略时,配合 .gitignore 的取反规则即可。
标准做法
mkdir uploads
touch uploads/.gitkeep
git add uploads/.gitkeep
git commit -m "保留 uploads 目录结构"
配套 .gitignore:保留目录但忽略内容
uploads/*
!uploads/.gitkeep
这样队友 clone 后目录存在,运行期产生的上传文件又不会进版本库。
占位文件叫什么?
.gitkeep:流传最广的约定(非官方);.keep:一样的意思,更短;README.md:写几句"这个目录干什么用",对新人更友好。
三者效果相同,团队统一即可。
常见问题(FAQ)
Q:为什么 Git 不支持空目录?
Git 的对象模型只有 blob(文件内容)、tree(目录条目)、commit 等类型,tree 通过条目指向 blob——没有文件的目录在模型里就没有存在形式。这是设计决策而非缺陷。
Q:构建时需要某些空目录存在,怎么自动化?
两种方式:提交 .gitkeep(推荐,clone 即得);或在构建脚本里 mkdir -p,写进 Makefile/CI 步骤。依赖 .gitkeep 的好处是开发者零配置。
Q:.gitkeep 会影响程序读写该目录吗?
不会,它就是个普通空文件。少数场景(如"遍历目录下所有文件处理"的程序)记得排除它。