111

我正在尝试使用带有否定模式的 .gitignore 文件(以 ! 开头的行),但它没有按我预期的方式工作。

作为一个最小的例子,我有以下目录结构:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

在我的 gitignore 文件中,我有这个:

aaa/
!aaa/ccc/

我的理解(基于this doc page)是文件aaa/ccc/otherfile.txt不应该被忽略,但实际上git忽略了aaa下的所有内容。

我是否误解了这句话:“一个可选的前缀!否定模式;任何被先前模式排除的匹配文件都将再次包含。”?

顺便说一句,这是在带有 msysgit 1.7.0.2 的 Windows 上。

4

3 回答 3

194

我认为你真正想做的是:

aaa/*
!aaa/ccc

你告诉它“不要往里看aaa”,所以它甚至从不检查路径aaa/ccc。如果您使用通配符,它​​仍会读取 的内容aaa,然后每个条目与通配符匹配并被忽略,除非aaa/ccc将其放回。

于 2010-05-12T15:31:17.537 回答
26

如果要排除 中的所有内容aaa,但要包括aaa/ccc其下的所有内容,则应使用:

aaa/*
!aaa/ccc
!aaa/ccc/*

第一行告诉 git 忽略下面aaa的所有内容,第二行告诉它不要忽略实际上“启用”第三行的文件夹aaa/ccc,然后告诉它不要忽略下面的所有内容aaa/ccc

于 2014-01-06T00:37:18.147 回答
5

git status如果有人在运行之前仍然没有看到新的未被忽略的项目,git update-index可以帮助 git 查看更改(至少在 gitbash 的 1.9.x 版本中)。

于 2015-02-28T07:08:51.090 回答