Hacker News

不要创建 .gitkeep 文件,请改用 .gitignore(2023)

了解为什么 .gitkeep 文件会使您的 Git 仓库变得杂乱,以及 .gitignore 如何为您的项目提供更简洁、更高效的空目录管理方式。

4 最小阅读量

Mewayz Team

Editorial Team

Hacker News

在 Git 仓库管理中,一个常见的误区是使用 .gitkeep 文件来保留空目录。这种做法不仅过时,而且会带来不必要的维护负担。实际上,更现代、更高效的做法是正确配置和使用 .gitignore 文件来管理 Git 的跟踪行为。

为什么 .gitkeep 文件不是一个好主意?

.gitkeep 本身并不是 Git 的官方功能,它只是一个约定俗成的文件命名。开发者创建它的唯一目的是让 Git 跟踪一个原本会被忽略的空目录,因为 Git 默认不会跟踪空目录。虽然这个目标达到了,但它引入了一系列问题。

  • 造成仓库混乱:项目中的空目录越多,就需要创建越多的 .gitkeep 文件,导致仓库中充斥着大量除了“占位”外毫无实际意义的文件。
  • 增加维护成本:这些文件需要被管理,例如在目录不再为空时需要被删除,否则就成了冗余文件,增加了不必要的版本控制操作。
  • 混淆文件用途:对于新加入项目的开发者来说,看到 .gitkeep 文件可能会感到困惑,需要额外的时间去理解其存在的目的。
  • 非标准做法:由于它不是 Git 的标准规范,不同的团队可能会有不同的约定(比如也有人用 .keep),导致实践上的不一致。

.gitignore 文件究竟是如何工作的?

.gitkeep 的“占位”思路相反,.gitignore 文件的核心功能是“排除”。它允许你明确地告诉 Git 应该忽略哪些文件或目录,使其不被跟踪。它的工作机制非常直接:

  1. 创建一个名为 .gitignore 的文件,通常放在仓库的根目录或特定子目录下。
  2. 在文件中,每一行定义一个忽略规则。规则可以匹配文件、目录,也可以使用通配符(如 *)。
  3. Git 在检查文件状态时,会自动跳过所有符合 .gitignore 规则的文件,无论这些文件是否已经存在于工作目录中。

关键在于,Git 不仅会忽略列出的未跟踪文件,对于已经被跟踪的文件,如果后来被添加到 .gitignore,也需要通过 git rm --cached 命令将其从索引中移除,才能真正开始忽略。

核心洞察:不要想着“如何让 Git 跟踪空目录”,而应思考“我真正需要跟踪的是什么?”。.gitignore 让你专注于管理重要的内容,而不是通过占位符来迎合工具的限制。

使用 .gitignore 管理空目录有哪些具体优势?

既然 Git 不跟踪空目录,而我们又需要保留目录结构,那么正确的方法是利用 .gitignore 的忽略机制。你可以在需要保留的空目录中,创建一个 .gitignore 文件,并在其中写入以下规则:

💡 您知道吗?

Mewayz在一个平台内替代8+种商业工具

CRM·发票·人力资源·项目·预订·电子商务·销售点·分析。永久免费套餐可用。

免费开始 →
# 忽略此目录下的所有文件
*
# 但不忽略这个 .gitignore 文件本身
!.gitignore

这种做法相比 .gitkeep 的优势非常明显:

  • 意图清晰:这个 .gitignore 文件明确表达了“此目录除本忽略文件外,其他所有内容都应被忽略”的意图,逻辑上更自洽。
  • 功能强大:它不仅保留了空目录,还预先定义了对未来可能产生的临时文件或编译产物的忽略规则,一劳永逸。
  • 符合标准:使用的是 Git 官方的功能,是所有 Git 使用者都应该掌握的最佳实践。
  • 易于维护:当目录中开始存放需要被跟踪的实际文件时,你只需从 .gitignore 规则中将其排除(使用 !filename)即可,无需删除或修改占位符文件。

如何在项目中有效实施 .gitignore 策略?

要系统地用好 .gitignore,建议遵循以下步骤:

  1. 创建全局 .gitignore:在你的用户主目录下创建一个全局 .gitignore 文件,用于忽略所有项目通用的文件(如编辑器临时文件 .DS_Store*.swp 等)。通过命令 git config --global core.excludesfile ~/.gitignore_global 进行配置。
  2. 完善项目级 .gitignore:在每个项目的根目录下创建特定的 .gitignore 文件,忽略与项目相关的构建输出(如 node_modules/, dist/)、配置文件等。
  3. 善用模板:GitHub 提供了一个非常全面的 .gitignore 模板库,涵盖了几乎所有编程语言和框架。在项目初始化时,直接选用对应的模板可以事半功倍。
  4. 替代 .gitkeep:对于需要保留的空目录,使用上文提到的“忽略所有但保留 .gitignore”的方法。

常见问题解答 (FAQ)

1. 我已经创建了 .gitkeep 文件,该如何迁移到 .gitignore 方法?

迁移过程很简单。首先,在原先放置 .gitkeep 文件的空目录中,创建 .gitignore 文件并写入 *!.gitignore 规则。然后,使用 git rm path/to/.gitkeep 命令删除旧的 .gitkeep 文件并提交这次更改。这样,目录结构得以保留,但采用了更规范的方法。

2. 使用 .gitignore 方法后,我的空目录会被推送到远程仓库吗?

会的。因为目录中现在包含了一个被跟踪的 .gitignore 文件,所以该目录不再是空的。当你执行 git push 时,目录结构连同其中的 .gitignore 文件都会被推送到远程仓库,从而实现了保留目录的目的。

3. 这种方法适用于所有版本的 Git 吗?

是的。.gitignore 是 Git 的核心功能,历史悠久且非常稳定。你提到的这种在 .gitignore 中使用否定规则(!)来保留自身的方法,在所有现代版本的 Git 中都得到完美支持,可以放心使用。

告别过时实践,拥抱高效开发

软件开发的最佳实践总是在不断演进。摒弃 .gitkeep 这种权宜之计,转而采用基于 .gitignore 的标准方法,不仅能保持代码仓库的整洁和规范,更能体现出一个团队对开发工具的精通和对工程效率的追求。就像使用 Mewayz 来整合你的业务操作一样,选择正确、高效的工具和方法,是提升团队生产力的关键一步。

立即体验 Mewayz,用一个平台统一管理你的项目、任务和团队协作,让效率触手可及。
免费开始使用 Mewayz

免费试用 Mewayz

集 CRM、发票、项目、人力资源等功能于一体的平台。无需信用卡。

立即开始更智能地管理您的业务

加入 30,000+ 家企业使用 Mewayz 专业开具发票、更快收款并减少追款时间。无需信用卡。

觉得这有用吗?分享一下。

准备好付诸实践了吗?

加入30,000+家使用Mewayz的企业。永久免费计划——无需信用卡。

开始免费试用 →

准备好采取行动了吗?

立即开始您的免费Mewayz试用

一体化商业平台。无需信用卡。

免费开始 →

14 天免费试用 · 无需信用卡 · 随时取消