bang 似乎不排除 .gitignore 中的文件

Joe*_*Fan 4 git

我有一个foo包含 2 个文件的目录,bar以及baz. 我有以下.gitignore文件,就在foo目录正上方:

foo/
!foo/baz
Run Code Online (Sandbox Code Playgroud)

我预计这将忽略所有foo目录,除了它应该不会忽视baz

但是,所有foo内容仍然被忽略。如果我运行git check-ignore foo/*,我会得到:

foo/bar
foo/baz
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Joh*_*ter 6

.gitignore不支持该特定公式:

一个可选的前缀“ !”,它否定了模式;任何被先前模式排除的匹配文件将再次包含在内。如果排除了该文件的父目录,则无法重新包含该文件。出于性能原因,Git 不会列出排除的目录,因此包含文件的任何模式都不起作用,无论它们在哪里定义。对于以文字“ ”开头的模式,例如“ ”,\在第一个“ !”之前放置一个反斜杠(“ ”)。!\!important!.txt

相反,你可以这样做:

foo/*
!foo/baz
Run Code Online (Sandbox Code Playgroud)

这是一个示例会话,以便您可以看到它的运行情况:

:: tree
.
`-- foo/
    |-- bar
    `-- baz

:: cat .gitignore
foo/*
!foo/baz

:: git status -sb
## Initial commit on master
?? .gitignore
?? foo/

:: git add foo
:: git status -sb
## Initial commit on master
A  foo/baz
?? .gitignore
Run Code Online (Sandbox Code Playgroud)

请注意,添加了 baz 但忽略了 bar。

要查看如果 baz 不在 foo 中会是什么样子,我们可以重置然后删除 baz:

:: git reset
:: rm foo/baz
:: git status -sb
## Initial commit on master
?? .gitignore
Run Code Online (Sandbox Code Playgroud)

请注意,即使 foo/bar 仍然存在, foo 也不会出现在这里。