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

Reference

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