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

时间:2010-05-12 15:25:28

标签: git gitignore

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

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

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

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

aaa/
!aaa/ccc/

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

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

BTW,这是在Windows上使用msysgit 1.7.0.2。

3 个答案:

答案 0 :(得分:123)

我认为你真正想做的是:

aaa/*
!aaa/ccc

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

答案 1 :(得分:13)

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

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

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

答案 2 :(得分:1)

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