.gitignore可以排除目录中的文件,但不能排除特定的目录。

102
application/cache/*
application/cache/folder/*
application/cache/folder/onemorefolder/*

这似乎没有起作用。当我克隆项目时,没有 "application/cache" 文件夹或 "application/cache/folder" 等文件夹...

我希望缓存文件夹中的文件不会被缓存,但文件夹会被缓存,以便文件夹权限可以传递和存在。

5个回答

225

Git并不跟踪文件夹,只跟踪文件,所以如果您忽略了一个文件夹中的所有内容,Git将无法跟踪它。您可以在每个目录(application/cacheapplication/cache/folderapplication/cache/folder/onemorefolder/)中添加一个.gitignore文件,并使用以下内容:

*
!.gitignore

然后,您可以添加这些目录,只有每个目录中的.gitignore文件会被添加 - 但这意味着这些目录现在将被跟踪(即,在克隆时创建)。


7
用于此目的的.gitignore文件可以是空的。 - kevpie
2
如果文件夹被上层的.gitignore文件忽略,它们可能为空。在这种情况下,这正是我的答案。 - KingCrunch
4
更明智和简单的方法是使用名为.gitkeep的文件,这样您就无需在.gitignore文件中放置任何内容。 - Hedgehog
4
@kevpie 这个文件夹里还有其他文件,他不希望这些文件被追踪。如果 .gitignore 文件是空的,那么这些文件将会被追踪。 - maliayas
@CommaToast:如果您想要一个子目录不被忽略,请添加!subdir - mipadi
显示剩余3条评论

22

Git不会跟踪空目录。只需在要提交的文件夹中添加一些空的占位文件。

touch application/cache/.keep
git add -f application/cache/.keep

对于每个“空”文件夹,也要执行此操作。以后您可以忽略这些文件,它们只是确保Git在克隆时创建这些目录的存在。 .gitignore 中的条目会防止跟踪文件夹中其他文件的更改(除非您使用 git add -f 强制添加)。


17

有另一种可能更简洁的方法来做到这点。而不是在你想要保留的文件夹中有子级 .gitignore 文件,你可以把它放在根目录下的 .gitignore 中,如下所示:

application/cache/*
application/cache/folder/*
application/cache/folder/onemorefolder/*
!*.gitkeep

现在只需在上述列出的目录中创建并提交空的 .gitkeep 文件。然后,该文件夹将受到这些 .gitkeep 文件的跟踪,但不会跟踪任何内容。


2
或者只是 !*.gitkeep :) - Éderson T. Szlachta
问题是如何忽略文件夹的内容但保留文件夹本身。因此,我相信我的答案是正确的,只有!*.gitkeep不会忽略文件夹的内容。 - Joel Duckworth

3
您可以在每个文件夹中放置一个.gitignore文件(就像mipadi所说的那样),或者在根目录的.gitignore文件中添加类似的内容。请注意,不要删除任何HTML标记。
/assets/*/
/assets/*.*

对我来说它运行良好。


这个可以工作,但只有当仓库使用文件扩展名时才有效。类似 root/LICENSE-FILE 这样的内容将不会被排除。 - Brett Zamir

3

Visual Studio不认可被接受的答案。我必须在星号(*)前添加一个新行才能使其正常工作。

# Ignore all files in this folder.
*
!.gitignore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接