我正在使用版本为1.7.1的git,尝试排除除 .php 文件之外的所有文件。
我找到的可行解决方案依赖于命令!*/
# Ignore Everything
*
# Except these files
!.gitignore
!*/
!*.php
如果没有 !*/
,它将只包括根目录中的 *.php
文件。 !*/
是如何使其工作的?
请查看gitignore文档
"!"前缀是可选的,用于否定匹配模式;任何被前面的模式排除的匹配文件将会再次被包含。如果父目录被排除,则无法重新包含文件,由于性能原因,Git不会列出被排除的目录,因此对包含在其中的文件的任何模式都没有效果,无论其定义在哪里。对于以字面"!"开头的模式,例如"!important.txt",在第一个"!"前面加上反斜杠(“\”)。
这是我的思路:
忽略语句*
默认情况下会忽略所有内容,包括根目录及其所有内容。
因此,在这一点上,根目录中的所有文件和文件夹都被忽略了。
!*.php
命令将在根路径中重新包含所有*.php
文件,但文件夹仍然被忽略(因为它们不以.php
结尾)- 因此,它们还没有从gitignore中否定。
所以!*/
命令重新包含所有目录(以及随后的子目录),以便可以检查其中是否有*.php
文件。例如: folder1/
与否定语句!*/
匹配,因为它以/
结尾并且文件夹名称符合通配符运算符*
。
!*/
行不需要放在 *.php
行之前吗?这样 git 才能看到要搜索 php 文件的目录,是这样吗?或者在 .gitignore
中顺序没有任何影响? - Jacob Ford.gitignore
文件从上到下读取(否则,如何确定先前的模式?)如果在!*/
之前有!*.php
,则文件夹对!*.php
是未知的。但这只是问题的重点所在。你可以将.gitignore
文件想象成一个漏斗。 - sjagr!*.php
会在 !*/
之前,但现在我明白你只是按那个顺序解释它。 - Jacob Ford
/
中的所有内容,也就是说不要忽略子目录。 - Sammitch