简单来说,.gitkeep 是一个约定俗成的虚拟文件。它的存在只有一个目的:强迫 Git 追踪一个本来应该是空的文件夹。
为什么需要它?
Git 的设计逻辑是 “追踪文件的变动”,而不是 “追踪文件夹”。如果你的项目里有一个空文件夹,Git 会视而不见,完全不会把它上传到 GitHub 或服务器上。
这会造成一个问题:有时候你的代码需要某个文件夹存在才能跑,但你又不希望把测试用的脏数据传上去。此时如果文件夹不存在,程序可能就会报错。
这些文件夹通常是:
logs/:存放日志文件uploads/:用户上传的文件tmp/:临时文件cache/:缓存数据
这些目录运行时需要、不能真的 commit 里面的内容,但文件夹本身又不能消失。
它的运作原理
为了 “骗” Git 留下这个文件夹,我们在里面塞一个没有实质功能的隐藏文件,让 Git 觉得“喔!这里面有东西,我要记下来”。
实务比喻:
想象你在盖房子(写项目):
| 文件 | 说明 |
|---|---|
.gitignore |
像是 “垃圾桶标签”,告诉清洁员(Git)哪些东西(如过期食物、废纸)绝对不要搬进新家。 |
.gitkeep |
像是 “占位用的纸箱”。新家还没装修好,但你得先把储藏室的位置留着,所以在那儿放个纸箱,让搬家公司知道这块区域也是房子的一部分,不能直接把它拆掉。 |
怎么使用?
- 在空文件夹内建立一个名为
.gitkeep的文件。 - 文件内容可以是空的,或是写一句“Keep this directory”。
- 将这个文件
git add并commit进去。
比较 .gitkeep 与 .gitignore
| 特性 | .gitkeep |
.gitignore |
|---|---|---|
| 官方身分 | 非官方(只是社区惯例) | 官方(Git 内置功能) |
| 主要功能 | 保留文件夹,避免被 Git 遗忘 | 排除文件,避免被 Git 追踪 |
| 常见情境 | 空的日志文件文件夹、缓存文件夹 | 密码文件、node_modules、临时文件 |
务实的建议:跳脱思维
虽然 .gitkeep 很常用,但它其实不是 Git 官方的一部分。事实上,你也可以用 README.md 或 .placeholder 来达到同样效果。但为什么大家偏爱 .gitkeep?因为一看就懂:“这文件什么都不干,只是让 Git 别删这个文件夹”。
如果你想显得更专业一点,有一个更有创意的做法,能比单纯用 .gitkeep 更具功能性:
在空文件夹放一个 .gitignore,内容写:
# 忽略此文件夹内的所有内容
*
# 但不要忽略我(这个 .gitignore 文件本身)
!.gitignore
这样做既能保留文件夹,又能确保里面的垃圾文件永远不会被误传,这才是真正的“防呆防灾防翻车”。
总结
.gitkeep是人类对 Git 设计逻辑的妥协。- 它不是官方规范,但已成为开发者的事实标准。
- 真正重要的是理解
.gitignore如何运作,.gitkeep只是帮 Git“补智商”的小工具。