.gitignore排除目录中的文件,但不排除某些目录中的文件


98
application/cache/*
application/cache/folder/*
application/cache/folder/onemorefolder/*

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

我想是否不缓存缓存文件夹中的文件,但缓存文件夹,以便文件夹权限转移并存在。

Answers:


220

Git不会跟踪文件夹,只会跟踪文件,因此,如果您忽略文件夹中的所有内容,Git将不会跟踪任何内容。您可以在添加.gitignore文件到每个目录(application/cacheapplication/cache/folderapplication/cache/folder/onemorefolder/)包含以下内容:

*
!.gitignore

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


7
用于此目的的.gitignore文件可以为空。
kevpie 2011年

2
如果上层.gitignore文件忽略了文件夹,则它们可以为空。在这种情况下,正是我的答案。
KingCrunch 2011年

4
更明智和更简单的方法是使用名为.gitkeep的文件,那么您不必在.gitignore文件中放置任何内容。
刺猬

3
@kevpie文件夹中还有其他文件,他不希望对其进行跟踪。如果.gitignore文件为空,则显然将跟踪那些文件。
maliayas

出于相同的目的,我使用.gitkeep代替.gitignore。它使我更有意义
埃德森T.什拉赫塔

22

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

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

还要对每个“空”文件夹执行此操作。以后您可以忽略这些文件,它们实际上仅存在以确保git在克隆上创建这些目录。中的条目.gitignore可防止跟踪文件夹中的其他文件(除非您用git add -f; 强制使用)。


16

还有另一种更清洁的方法可以做到这一点。而不是在要保留的文件夹中包含子.gitignore文件。您可以将其放在根.gitignore中,如下所示:

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

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


2
或只是!*.gitkeep:)
埃德森T. Szlachta

问题是如何忽略文件夹的内容,但保留文件夹本身。所以我相信我的回答是正确的,只有!!。gitkeep不会忽略文件夹的内容。
Joel Duckworth

3

您可以将.gitignore文件放在每个文件中(如mipadi所说),也可以在根.gitingnore文件中创建类似的文件

/assets/*/
/assets/*.*

这对我来说可以


这是有效的,但仅在存储库使用文件扩展名的情况下。类似的东西root/LICENSE-FILE不会被排除。
Brett Zamir 2015年

2

Visual Studio不喜欢接受的答案。我必须在*之前添加新行以使其起作用。

# Ignore all files in this folder.
*
!.gitignore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.