Git 会删除空文件夹吗?

Git 会删除空文件夹吗?

我删除了工作文件夹中某个目录中的所有文件,但该目录本身仍然存在。将更改推送到远程存储库后(GitHub) 我检查了我的项目,发现目录不见了。Git 有可能删除空文件夹吗?

答案1

为何没有显示目录?

Git 不跟踪目录;它只跟踪文件。

如果目录中没有文件,则在添加或删除文件时,该目录对 Git 来说“不存在”。具体来说,当您从目录中删除所有文件并将该更改添加到索引时,目录将从 Git 的索引中消失。反之亦然,git add如果目录为空,则不会添加目录。

换句话说:如果您可以在文件浏览器中本地看到该目录,但它从 GitHub 中消失,则您很可能从目录中删除了所有文件,将该更改添加到索引中,然后提交并推送它。

那么我该如何追踪空目录呢?

如果要明确跟踪空目录,则必须在其中创建一个文件。由于 Git 不会跟踪空目录,因此您必须通过将目录中的文件添加到 Git 的索引中来诱使它这样做。

通常,人们会将一个名为的文件存储.gitkeep在他们希望跟踪的目录中,但该目录暂时应保持为空。您可以将文件任何当然,也可以使用其他名称,但名称.gitkeep是一种惯例。大多数系统上的文件列表不会显示该.gitkeep文件(因为以 开头)。.

一些用户除了 之外.gitkeep,还喜欢README在那里放置一个文件,最好附带一个简短的描述,说明为什么该目录必须存在。

例子

$ mkdir foo
$ git init
$ git add .
$ git ls-files   # which files does Git know about?
                 # apparently, none
$ touch foo/bar  # create a file in the directory
$ git add .
$ git ls-files   # does Git know about it now?
foo/bar          # yep!

这里,foo只有当目录中有文件时,目录才会被添加到索引中。

如果我真的想要跟踪一个空目录吗?

综上所述,原则上,底层数据结构允许 Git 存储一个空目录,因为它将由一个空的“树”表示。进一步阅读这里这里

答案2

将以下.gitignore文件添加到您希望包含在 repo 中的文件夹中。

# Ignore everything in this directory
*
# Except this file
!.gitignore

添加.gitkeep有效但不是官方解决方案。请参阅https://stackoverflow.com/questions/7229885/what-are-the-differences-between-gitignore-and-gitkeep

答案3

git clean如果您使用-dffx(甚至可能是使用这些选项的子集)运行,Git 可能会删除文件夹。

正如@TRiG 在评论中提到的,如果提交时目录为空,它将不会显示在 GitHub 等中,因为 git 不跟踪目录(它跟踪文件)——这些文件所在的树不再相关,因为没有文件,所以没有树。

如果没有更多细节,我们几乎不可能正确回答你的基本问题(发生了什么?)。

答案4

对于 Linux / MAC OSX,使用以下单行命令,以递归方式创建/将空的占位符文件放入文件夹中,以防止它们被 git 忽略:

find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;

希望这对某人有帮助。

相关内容