git不跟踪空目录,因其只记录含文件的目录结构;最可靠方案是在空目录中添加.gitkeep空文件并提交。

Git 本身不跟踪空目录,所谓“保留空文件夹”只能靠变通手段实现——最可靠、最通用的做法是往空目录里放一个名为 .gitkeep 的空文件。
为什么 Git 不保存空文件夹?
Git 只记录文件(blob)和目录结构(tree),但目录必须至少包含一个被跟踪的文件才能生成 tree 对象。空目录没有对应 blob,Git 就直接忽略它——这不是 bug,是设计使然。
常见错误现象:git status 不显示空目录,git add mydir/ 没反应,git commit 后该目录在远程仓库里根本不存在。
用 .gitkeep 是最稳妥的方案
这不是 Git 内置机制,而是社区约定俗成的命名惯例(名字可任意,但 .gitkeep 最易识别、工具链兼容性最好)。
- 在目标空目录中创建空文件:
touch mydir/.gitkeep - 确保该文件未被
.gitignore屏蔽(默认不会,但若项目有.*忽略规则需检查) - 执行:
git add mydir/.gitkeep→git commit -m "add .gitkeep to keep mydir" - 提交后,
mydir/就会出现在工作区、暂存区和历史中,且保持为空(除.gitkeep外)
其他方法为什么不太推荐?
.gitignore 文件本身不能让 Git 跟踪目录——它只控制忽略逻辑;往里写 !/mydir/ 或 !mydir/** 都无效,因为没文件可“取消忽略”。
用 .gitkeep 以外的名字(如 .empty 或 README.md)也能工作,但存在风险:
-
README.md容易被误编辑或覆盖,破坏“空目录”语义 - 某些 CI/CD 工具或脚本可能扫描特定文件名,
.gitkeep是唯一广泛识别的占位符 - IDE(如 VS Code)对
.gitkeep有默认隐藏或低优先级渲染,不影响开发体验
注意:.gitkeep 不是魔法,它只是普通文件
它没有特殊权限、不需要特殊配置,也不影响 Git 性能。但它必须被 git add 过,且不能被 .gitignore 拦截。最容易被忽略的一点是:如果目录下后续新增了真实文件,.gitkeep 通常应手动删除——否则会显得冗余,也违背“空目录”的原始意图。











