假设有这样一个场景:你需要重新组织代码库的文件结构——调整文件夹的位置、把一些文件移动到新创建的文件夹中。

你开始移动代码、检查一切是否正常、新增一些文件夹供下次开发使用。这些新文件夹目前还是空的,下次开发会在两天内开始,但是由于现在就要迁移代码,所以你觉得最好把这些空文件夹先加入代码库。

你把所有东西都推送到项目分支,等待 QA 测试。你在 Slack 上告诉负责审查的同事你的工作已经完成,可以进行审查了。

然后他们克隆你的分支进行审查,由于你忘了把本该添加的文件夹加入代码库,所以审查无法通过。

等等……怎么回事?

为什么会这样?

这是因为 Git 不会推送空文件夹,它只会追踪文件。

虽然本地有这些文件夹,但是你尝试推送之后,它们并不会进入你的分支。

所以别人克隆你的代码得到的文件结构和你的本地环境不一致。

那么要如何解决这个问题呢?

如何使用 .gitkeep

我们知道了 Git 只追踪文件,所以只要往这些文件夹中加入一些文件就行了。

加入任何文件都是可行的。只需要往里面加入简单的虚拟文件,就可以使得文件夹被追踪,从而正常推送。

复制一个空的文本文件(如 file.txt)粘贴进去是可行的,你想放一张猫咪图片也行。

然而,常见的标准做法是在空文件夹中放一个 .gitkeep 文件。

这并不是 Git 提供的特性!所以你可以随意给这个文件命名。.gitkeep 这个名字并没有什么特殊含义——有些开发者也会用 .gitignore。(译注:然而 .gitignore 文件是有特殊含义的,最好别用这个名字。在实践中推荐使用 .gitkeep,如果随意命名可能会造成困惑。)

不过 .gitignore 会令人迷惑,因为你的目的是让 Git 不要忽略你的文件,并且把它推送到分支。

不管使用那种方式,通过添加这个简单的文件,你的文件夹到时就能够被正确推送。

总结

.gitkeep 在代码库中是很常见的,如果需要让 Git 追踪一个空文件夹,那其中一般会有这个文件。

这个虚拟文件的名字不一定总是 .gitkeep,不过作为开发者,你会一次又一次地看到这种实践。

如果你喜欢我的文章,可以关注我的 Twitter,以了解文章发布动态。

原文:What is .gitkeep? How to Track and Push Empty Folders in Git,作者:Kealan Parr