否定模式在.gitignore中如何工作?


91

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

作为最小的示例,我具有以下目录结构:

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

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

aaa/
!aaa/ccc/

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

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

顺便说一句,这是在Windows上使用msysgit 1.7.0.2的。

Answers:


157

我认为您真正想做的是:

aaa/*
!aaa/ccc

您是在告诉它“不要进入aaa”,因此它甚至不会检查路径aaa/ccc。如果您使用通配符,它​​仍会读取的内容aaa,则每个条目都与通配符匹配,并且会被忽略,除非将aaa/ccc其放回去。


2
@iconoclast:那么您可能正在做一些不同的事情。如果您需要帮助,请发布另一个问题(包含完整的信息)。
卡斯卡贝尔2012年

这对我也不起作用:/ apps / *!/ apps / myApps / FluidTest / bin /
Jarrod Smith,

5
@Jarrod确实有效;您只是在做一些不同的事情。出于答案中给出的确切原因,您将必须递归使用此方法。!apps / myApps,apps / myApps / *等。
卡斯卡贝尔2013年

抱歉,我现在明白了。但是SO不会让我再次投票。
加罗德·史密斯

想知道为什么它不工作,为AAA / ** / * AAA / CCC / EEE(忽略一切,除了文件在一定的路径)!
PHUONG阮

21

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

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

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


1
第三行对我没有影响。
詹姆斯·霍普金2014年

3
为了能够将所有内容包括aaa/ccc在任何级别的任何子目录中,对我!aaa/ccc/**!aaa/ccc/*
有用的

3

如果任何人仍然无法在git status运行git update-index之前查看到新的不可忽略的项目,则可以帮助git查看更改(至少在gitbash 1.9.x版中)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.