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

否定模式在.gitignore中是如何工作的?,git,gitignore,Git,Gitignore,我试图使用一个带有否定模式的.gitignore文件(以开头的行!),但它没有按我预期的方式工作 作为一个简单的例子,我有以下目录结构: C:/gittest -- .gitignore -- aaa/ -- bbb/ -- file.txt -- ccc/ -- otherfile.txt 在我的gitignore文件中,我有: aaa/ !aaa/ccc/ 我的理解(基于)是不应该忽略aaa/ccc/otherfile.txt文件,但事实上git忽略了

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

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

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt
在我的gitignore文件中,我有:

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

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


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

我认为您真正想要做的是:

aaa/*
!aaa/ccc

您告诉它“不要查看
aaa
”,因此它甚至从不检查路径
aaa/ccc
。如果使用通配符,它仍会读取
aaa
的内容,则每个条目都与通配符匹配并被忽略,但返回的
aaa/ccc
除外。

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

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

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

下的所有内容,如果有人在
git状态下仍然没有看到新的未被忽略的项目
在手前运行
git更新索引
可以帮助git看到更改(至少在gitbash的1.9.x版本中).

@iconoclast:那么你可能在做一些不同的事情。如果需要帮助,请发布另一个问题(包含完整信息)。这对我也不起作用:/apps/*/apps/myApps/FluidTest/bin/@Jarrod它确实有效;你只是在做一些不同的事情。你将不得不递归地使用这个方法,因为答案中给出的理由正是如此!apps/myApps、apps/myApps/*等等。不知道为什么它对aaa/***不起作用!aaa/ccc/eee(忽略所有内容,除了特定路径上的文件)第三行对我来说没有什么区别。为了能够在任何级别将所有内容都包含在
aaa/ccc
的任何子目录中,对我有效的是
!aaa/ccc/**
而不是
!aaa/ccc/*