Gitignore中排除所有子目录中的特定文件

6
我有一个名为/static的目录,其中包含许多子目录。 我需要忽略/static/目录下所有子目录中的所有文件,除了.htaccess、null.jpg和index.php文件之外。 请告诉我正确的语法是什么?
/static/**
!/static/**/.htaccess

and

/static/*
!/static/*/.htaccess

无法工作。


我认为你应该首先将目录列入白名单。在你的第一种方案中, !/static/**/ 作为第二行是否可行? - Willem Van Onsem
1个回答

10
如我在“在gitignore中包含特定文件扩展名”中提到的,需要记住的主要规则是:

如果父目录被排除在外,则无法重新包含文件。 (*)
(*: 除非在 git 2.?+ 中满足某些条件,请参见下文)

这就是为什么忽略文件夹的任何规则(例如**/)都将使排除任何子文件变得不可能。
这就是为什么正确的方法是排除所有内容,除了:
  • 文件夹,
  • 然后)您想要排除的文件。
如果您不先排除文件夹,则仍将忽略您的文件(因为我上面提到的规则)。
因此,在您的.gitignore中添加:
/static/**/**
!/static/**/
!.gitignore
!.htaccess

这是在Git 2.4.1上进行测试的,即使在Windows上也可以正常工作。


请注意,使用git 2.9.x/2.10(2016年中期?),如果文件的父目录被排除并且路径中没有通配符重新包含,则可能重新包含该文件。 Nguyễn Thái Ngọc Duy (pclouds)正在尝试添加此功能: 然而,由于其中一个条件是“重新包含规则中的目录部分必须是字面值(即无通配符)”,因此您无法在这里使用该功能。

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