.gitignore 通配符后缀排除与子文件夹的否定

.gitignore wildcard suffix exclusion with negation for subfolder

我有一个 .gitignore 是这样的:

*.png
*.jpg
*.gif
!0/*.png
!0/*.jpg
!0/*.gif

我想忽略所有文件夹中但不在文件夹 /0/ 中的所有图像文件(.png、.jpg、.gif)。不应忽略此文件夹中的所有图像文件。

我尝试使用上面的 .ignore 文件,但它不起作用,因为 /0/ 中的图像文件仍然被忽略。怎么写才正确?

忽略模式:

!0/*.png

表示"don't ignore any *.png file that is directly inside a folder named 0"。所以这将包括 0/abc.png,它会包括 1/0/def.png,但它会排除 0/1/ghi.png

如果要包含文件夹 0 下的所有 *.png,有两种方法可以做到这一点。

您可以使用以下模式:

*.png
!/0/**/*.png

** 模式匹配任何系列的子目录,包括根目录。以 / 开头的模式意味着模式必须从当前目录开始匹配。 所以这将包括 0/abc.png0/subdir/def.png0/subdir/ghi/jkl.png。它将排除 abc.png1/abc.png.

或者,您可以使用

创建文件 .gitignore
*.png

然后您可以创建另一个文件,0/.gitignore,其中包含:

!*.png

这个更明显一点,效果完全一样

演示

这是基本 *.png 规则,它忽略所有 *.png 文件:

$ git init
Initialized empty Git repository in .../.git/
$ mkdir -p 0/1
$ touch img.png 0/img.png 0/1/img.png
$ cat >.gitignore
*.png
$ git add -n .
add '.gitignore'

这是您的规则,其中包括任何名为 0:

的目录中的任何 *.png
$ cat >.gitignore
*.png
!0/*.png
$ git add -n .
add '.gitignore'
add '0/img.png'

固定模式如下:

$ cat >.gitignore  
*.png
!/0/**/*.png
$ git add -n .
add '.gitignore'
add '0/1/img.png'
add '0/img.png'

这是替代方案:

$ cat >.gitignore
*.png
$ cat >0/.gitignore
!*.png
$ git add -n .
add '.gitignore'
add '0/.gitignore'
add '0/1/img.png'
add '0/img.png'