Git本身不跟踪空文件夹,需通过添加占位文件(如.gitkeep、.gitignore或README.md)使其被识别并提交;推荐使用.gitkeep,因其轻量、无歧义且符合社区惯例。

Git 本身不支持直接添加空文件夹——这不是操作失误,而是设计使然。只要目录下没有被 Git 跟踪的文件,git add 就不会把它纳入暂存区,git status 里也完全不会显示它。
为什么 git add folder/ 没反应?
执行 git add path/to/empty_folder 后没有任何输出、也没有出现在 git status 中,是因为 Git 只检查路径下是否有「可跟踪文件」。空目录不产生任何 blob 对象,Git 甚至不认为它“存在”于工作树的版本控制语境中。
常见错误现象:
-
git add命令静默失败(无报错也无提示) -
git status不列出该目录,即使它物理存在 -
git commit -m "add empty dir"提交后,远程仓库依然看不到该目录
用 .gitkeep 是最稳妥的通用方案
在空目录中放一个空文件,是最轻量、最易理解、团队协作中最少歧义的做法。.gitkeep 不是 Git 内置关键字,只是社区约定俗成的占位文件名——它不触发任何特殊逻辑,但能明确表达意图。
实操建议:
- 进入目标空目录:
cd path/to/empty_folder - 创建空文件:
touch .gitkeep(Linux/macOS)或type nul > .gitkeep(Windows cmd),或用 Git Bash 运行touch .gitkeep - 回到仓库根目录,只添加这个文件:
git add path/to/empty_folder/.gitkeep(不要用git add .,避免误提交其他未暂存文件) - 提交:
git commit -m "chore: keep empty_folder structure"
注意:.gitkeep 文件内容为空即可,无需写注释;也不需要修改 .gitignore——Git 默认不忽略以 . 开头的文件,除非你显式写了 .* 规则。
用 .gitignore 放进空目录反而容易出错
有人尝试在空目录里建 .gitignore 并写入 * + !.gitignore,想靠“忽略全部但保留自己”来骗 Git 跟踪目录。这方法理论上可行,但有明显缺陷:
- 如果该目录后续要放真实文件,得反复改
.gitignore,维护成本高 - 某些旧版 Git(! 规则解析不稳定,可能导致文件意外被忽略
-
git status会显示该.gitignore为“untracked”,需额外git add,不如.gitkeep直观
所以除非你明确需要该目录具备「未来自动忽略新文件」的能力,否则不推荐。
批量处理多个空目录时小心递归边界
用 find . -type d -empty -exec touch {}/.gitkeep \; 看似方便,但要注意两点:
- 它会命中
.git目录(因为它是空的),导致报错或污染 Git 元数据 —— 加上-not -path "./.git*"排除 - 如果某空目录下有子目录(但子目录也为空),
-empty会匹配所有层级,可能重复创建多个.gitkeep—— 实际影响不大,但冗余
更安全的写法是:find . -type d -empty -not -path "./.git*" -exec touch {}/.gitkeep \;
真正容易被忽略的是:有些“空目录”其实包含隐藏文件(如 .DS_Store 或 .env),-empty 判定会失败。建议先用 ls -la path/to/dir 确认是否真为空,再批量操作。


















