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

Chr*_*ins 77 git gitignore

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

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

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt
Run Code Online (Sandbox Code Playgroud)

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

aaa/
!aaa/ccc/
Run Code Online (Sandbox Code Playgroud)

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

我误解了这句话:"一个可选的前缀!否定了模式;先前模式排除的任何匹配文件将再次被包括在内."?

顺便说一下,这是在Windows上使用msysgit 1.7.0.2.

Cas*_*bel 136

我认为你真正想做的是:

aaa/*
!aaa/ccc
Run Code Online (Sandbox Code Playgroud)

你告诉它"不要看aaa",所以它甚至从未检查过这条道路aaa/ccc.如果使用通配符,它​​仍会读取内容aaa,则每个条目都匹配通配符并被忽略,除非aaa/ccc将其放回.

  • @Jarrod确实有用; 你只是做了不同的事情.由于答案中给出的原因,您必须递归地使用此方法.!apps/myApps,apps/myApps/*等等. (5认同)
  • @iconoclast:然后你可能会做一些不同的事情.如果您需要帮助,请发布另一个问题(包含完整信息). (2认同)

小智 17

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

aaa/*
!aaa/ccc
!aaa/ccc/*
Run Code Online (Sandbox Code Playgroud)

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

  • 为了能够在任何级别的"aaa/ccc"的任何子目录中包含所有内容,对我有用的是`!aaa/ccc/**`而不是`!aaa/ccc/*` (2认同)

ale*_*xkb 5

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