Featured image of post Git 为什么不追踪空文件夹?.gitkeep 与 .gitignore 用途是什么?

Git 为什么不追踪空文件夹?.gitkeep 与 .gitignore 用途是什么?

深入了解为什么 Git 忽略空文件夹,以及如何正确使用 .gitkeep 与 .gitignore 来管理项目目录结构。包含实务范例与最佳实践技巧。

简单来说,.gitkeep 是一个约定俗成的虚拟文件。它的存在只有一个目的:强迫 Git 追踪一个本来应该是空的文件夹。

为什么需要它?

Git 的设计逻辑是 “追踪文件的变动”,而不是 “追踪文件夹”。如果你的项目里有一个空文件夹,Git 会视而不见,完全不会把它上传到 GitHub 或服务器上

这会造成一个问题:有时候你的代码需要某个文件夹存在才能跑,但你又不希望把测试用的脏数据传上去。此时如果文件夹不存在,程序可能就会报错。

这些文件夹通常是:

  • logs/:存放日志文件
  • uploads/:用户上传的文件
  • tmp/:临时文件
  • cache/:缓存数据

这些目录运行时需要不能真的 commit 里面的内容,但文件夹本身又不能消失

它的运作原理

为了 “骗” Git 留下这个文件夹,我们在里面塞一个没有实质功能的隐藏文件,让 Git 觉得“喔!这里面有东西,我要记下来”。

实务比喻:

想象你在盖房子(写项目):

文件 说明
.gitignore 像是 “垃圾桶标签”,告诉清洁员(Git)哪些东西(如过期食物、废纸)绝对不要搬进新家。
.gitkeep 像是 “占位用的纸箱”。新家还没装修好,但你得先把储藏室的位置留着,所以在那儿放个纸箱,让搬家公司知道这块区域也是房子的一部分,不能直接把它拆掉。

怎么使用?

  1. 在空文件夹内建立一个名为 .gitkeep 的文件。
  2. 文件内容可以是空的,或是写一句“Keep this directory”。
  3. 将这个文件 git addcommit 进去。

比较 .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“补智商”的小工具。

Reference

All rights reserved,未經允許不得隨意轉載
Built with Hugo
主题 StackJimmy 设计