.gitignore中的!*/是什么意思?

35

我正在使用版本为1.7.1的git,尝试排除除 .php 文件之外的所有文件。

我找到的可行解决方案依赖于命令!*/

# Ignore Everything
*

# Except these files
!.gitignore
!*/
!*.php

如果没有 !*/,它将只包括根目录中的 *.php 文件。 !*/ 是如何使其工作的?


5
不要忽略以斜杠结尾的目录/中的所有内容,也就是说不要忽略子目录。 - Sammitch
2个回答

33

请查看gitignore文档

"!"前缀是可选的,用于否定匹配模式;任何被前面的模式排除的匹配文件将会再次被包含。如果父目录被排除,则无法重新包含文件,由于性能原因,Git不会列出被排除的目录,因此对包含在其中的文件的任何模式都没有效果,无论其定义在哪里。对于以字面"!"开头的模式,例如"!important.txt",在第一个"!"前面加上反斜杠(“\”)。


1
之前,我错过了这段话的关键部分...“如果一个文件的父目录被排除在外,则无法重新包含该文件。”谢谢! - bitsoflogic
没问题 :) 很高兴能帮到您。 - Bijan

14

这是我的思路:

忽略语句*默认情况下会忽略所有内容,包括根目录及其所有内容。

因此,在这一点上,根目录中的所有文件和文件夹都被忽略了。

!*.php命令将在根路径中重新包含所有*.php文件,但文件夹仍然被忽略(因为它们不以.php结尾)- 因此,它们还没有从gitignore中否定。

所以!*/命令重新包含所有目录(以及随后的子目录),以便可以检查其中是否有*.php文件。例如: folder1/与否定语句!*/匹配,因为它以/结尾并且文件夹名称符合通配符运算符*


这对我来说完全有道理,除了:!*/ 行不需要放在 *.php 行之前吗?这样 git 才能看到要搜索 php 文件的目录,是这样吗?或者在 .gitignore 中顺序没有任何影响? - Jacob Ford
@JacobFord 正确 - 文档指定了先前的模式,并且.gitignore文件从上到下读取(否则,如何确定先前的模式?)如果在!*/之前有!*.php,则文件夹对!*.php是未知的。但这只是问题的重点所在。你可以将.gitignore文件想象成一个漏斗。 - sjagr
我的错!看起来你的回答暗示 !*.php 会在 !*/ 之前,但现在我明白你只是按那个顺序解释它。 - Jacob Ford

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