Git 会删除空文件夹吗?

vit*_*4us 49 git github

我从我的工作文件夹中的目录中删除了所有文件,但该目录本身仍然存在。将更改推送到远程存储库 ( GitHub ) 后,我检查了我的项目并注意到该目录已消失。Git是否有可能删除空文件夹?

slh*_*hck 98

为什么目录不显示?

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

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

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

那么如何跟踪空目录呢?

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

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

取而代之的是.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!
Run Code Online (Sandbox Code Playgroud)

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

如果我真的想跟踪一个空目录怎么办?

总而言之,原则上,底层数据结构允许 Git 存储一个空目录,因为它将由一个空的“树”表示。一些进一步阅读herehere

  • 不能有点误导。目标文件(树和 blob)的结构支持空目录。它只是故意决定不跟踪空目录 (13认同)
  • @Davor 嗯,这有点定义问题。是的,它主要跟踪文件内容,但它也跟踪指向该内容的路径。Git 存储的树条目*是*文件名,它们指向实际内容。 (6认同)
  • Git 甚至不跟踪 *files*,它跟踪文件内容。这就是为什么它可以即时识别重命名的文件。 (3认同)

sun*_*sen 7

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

# Ignore everything in this directory
*
# Except this file
!.gitignore
Run Code Online (Sandbox Code Playgroud)

添加.gitkeep有效,但不是官方解决方案。见/sf/ask/506091981/

  • 这确实会确保 Git 跟踪空目录,但它也会阻止 Git 跟踪该目录中的任何其他文件——所以这是为了如果你想要一个应该在 Git 中*始终*保持空的目录。 (28认同)
  • 没有所谓的“官方”解决方案。在 git 中,您不能有空目录。添加一个文件,该目录中的任何文件都有效,因为它不再是一个空目录。这是完全记录在案的“官方”行为。.gitignore 在文档中,与您可能使用的其他文件名不同,因为它执行不相关的事情:使 git 忽略特定文件。这并不能使它成为解决此问题的更好方法。相反,这让人感到困惑,因为人们会期望它做其他事情,而不仅仅是在那里保存目录。 (18认同)
  • 我认为@NobodyNada 的评论应该是这个答案的一部分。有些人可能希望他们的 Git 项目包含一个空目录并且从不跟踪(比如“build”目录?) (3认同)