忽略除了一个特定扩展名和文件夹结构之外的所有文件。

70
我希望的是忽略除 .php 文件以外的所有文件,但使用这个 .gitignore 文件我也在忽略文件夹...
#ignore all kind of files
*
#except php files
!*.php

有没有一种方法可以让Git接受我的项目文件夹结构,同时只跟踪.php文件?

现在似乎我无法将文件夹添加到我的仓库中:

vivo@vivoPC:~/workspace/motor$ git add my_folder/
The following paths are ignored by one of your .gitignore files:
my_folder
Use -f if you really want to add them.
fatal: no files added

Git 只跟踪文件而不是目录。如果您忽略目录中的所有文件,则该目录将不会被添加到项目中。 - FDinoff
我已经编辑了我的问题,似乎现在无法添加那个文件夹。 - javier_domenech
目录里有什么? - FDinoff
许多不同类型的文件(.php,.sql,其他子文件夹...)。 - javier_domenech
这个回答是否解决了您的问题?有没有办法告诉git只包括某些文件而不是忽略某些文件? - miken32
5个回答

65
这很简单,只需在你的.gitignore中添加另一条记录!my_folder
#ignore all kind of files
*
#except php files
!*.php
!my_folder
最后一行代码会特别关注 "my_folder",并且不会忽略其中的任何 php 文件;但是其他文件夹中的文件仍然会被忽略,因为第一个 "*" 的模式。 编辑

如果你想要忽略除了 ".php" 文件外的所有文件,你可以使用

#ignore all kind of files
*.*
#except php files
!*.php

这将不会忽略任何没有扩展名的文件(例如:如果您有README而不是README.txt),并且将忽略名称中带有.的文件夹(例如:名为module.1的目录)。

顺便说一句,Git 不跟踪目录,因此无法指定针对目录和文件的忽略规则。


谢谢,它能工作。但是是否有可能不忽略任何文件夹,即使我们没有在 .gitignore 中指定它们? - javier_domenech
非常感谢您的解释,据我所理解,gitignore规则不区分文件夹和文件。如果我们有一种方法可以告诉“这个规则是针对文件的”或“这个规则是针对目录的”.. - javier_domenech
3
@vivoconunxino 不,这是不可能的;git根本不跟踪文件夹。gitignore中的条目是模式,任何与其匹配的文件名或文件路径(即目录)都将被忽略。 - Anshul Goyal
有没有办法在忽略语句之前编写异常并使其正常工作? - Aaron John Sabu

39

我曾经遇到过类似的问题:我想把*.c加入白名单,但是接受的答案对我不起作用,因为我的文件中没有包含“.”。

所以,对于那些想要解决这个问题的人:

# ignore everything
*

# but don't ignore files ending with slash = directories
!*/

# and don't ignore files ending with ".php"
!*.php

4
完美!(添加.gitignore - Ivan Ferrer Villa

17

这对我起作用(排除所有imgs文件夹中的内容,但保留.gitkeep文件)

/imgs/**/*.*
!/imgs/**/.gitkeep

正是我所需要的。(我不需要开头的斜线) - takanuva15
1
请注意,如果您的目录名称中包含“.”字符,则此方法将无效。您需要在两行代码之间插入以下文本!/imgs/**/*.*/ - mbaker3

6
请注意,如果 ! 没有作用,则可能是您排除了一个文件夹。来自文档的内容(重点在于我):

一个可选的前缀“!”否定该模式;任何与先前模式匹配的文件将再次被包含。 如果排除了该文件的父目录,则无法重新包含文件。出于性能原因,Git不会列出被排除的目录,因此包含在其中的文件上的任何模式都没有效果,无论它们在哪里定义。


重要提示,非常感谢。 - lisardo
1
为了解决这个限制,您可以重新添加所有目录条目。例如:mydir/** ; ~mydir/**/ ; !mydir/**/*.myextension - mbaker3

0

找不到我要找的那个,所以添加了一个对我有用的。

以下声明说明了:

  1. 忽略所有内容(包括子目录,递归地)
  2. 排除特定文件不被忽略
  3. 排除所有子目录不被忽略

现在,如果你注意到步骤3,你会发现它具有步骤1、2声明的累积效果。也就是说,在递归地取消忽略每个子目录时,直接忽略该子目录下的所有内容,除了在步骤2中被忽略的一些文件。这将对正在处理的每个子目录执行,因此声明的顺序/序列很重要。

示例:

subdir1
  \subdir11\others.txt
  \subdir12\build.xml
  .gitignore
subdir2
  \subdir21\resources\build.xml
  \subdir22\build.xml
build.xml
.gitignore

.gitignore文件应包含以下内容

# !! NOTE: the sequence of declaration is important !!

# Ignore Everything
*

# Exclude specific files from being ignored (override)
!.gitignore
!*.xml

# overrides stated above, applies to all dir (root and subdirs - recursively)
!**/

结果:

subdir1\subdir12\build.xml
subdir1\.gitignore
subdir2\subdir21\resources\build.xml
subdir2\subdir22\build.xml
build.xml
.gitignore

如果你在筛选过的内容之后仍然想要进一步减少或过滤更多内容,将其添加到处理的下一步(记住:顺序很重要)。
# !! NOTE: the sequence of declaration is important !!

# Ignore Everything
*

# Exclude specific files from being ignored (override)
!.gitignore
!build.xml

# overrides stated above, applies to all dir (root and subdirs - recursively)
!**/

**/resources/**


现在,这将添加第四步,即在子目录中忽略包含中间资源目录的*.xml文件(仅限子目录),这些目录在第三步的结果中被过滤掉。
结果:
subdir1\subdir12\build.xml
subdir1\.gitignore
subdir2\subdir22\build.xml
build.xml
.gitignore

这并不止于此,你还可以在第二步中仅针对子目录忽略未被忽略的文件(这样它们只会被包含在根目录中,而不会出现在子目录中)。
# !! NOTE: the sequence of declaration is important !!

# Ignore Everything
*

# Exclude specific files from being ignored (override)
!.gitignore
!build.xml

# overrides stated above, applies to all dir (root and subdirs - recursively)
!**/
**/resources
**/.gitignore

除了步骤4的结果外,这还将在除根目录之外的所有子目录中排除.gitignore文件。

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