我删除了工作文件夹中某个目录中的所有文件,但该目录本身仍然存在。将更改推送到远程存储库后(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
只有当目录中有文件时,目录才会被添加到索引中。
如果我真的想要跟踪一个空目录吗?
答案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 \;
希望这对某人有帮助。