【问题标题】:How do negated patterns work in .gitignore?.gitignore 中的否定模式如何工作?
【发布时间】:2011-02-18 16:48:28
【问题描述】:

我正在尝试使用带有否定模式的 .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 上。

【问题讨论】:

    标签: git gitignore


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 第三行对我没有影响。
      • 为了能够在任何级别包含aaa/ccc 的任何子目录中的所有内容,对我有用的是!aaa/ccc/** 而不是!aaa/ccc/*
      【解决方案3】:

      我认为你真正想做的是:

      aaa/*
      !aaa/ccc
      

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

      【讨论】:

      • @iconoclast:那么您可能正在做一些不同的事情。如果您需要帮助,请发布另一个问题(包含完整信息)。
      • 这对我也不起作用:/apps/* !/apps/myApps/FluidTest/bin/
      • @Jarrod 确实有效;你只是在做一些不同的事情。由于答案中给出的原因,您必须递归地使用此方法。 !apps/myApps、apps/myApps/* 等等。
      • 想知道为什么它不适用于 aaa/**/* !aaa/ccc/eee(忽略所有内容,特定路径下的文件除外)
      猜你喜欢
      • 1970-01-01
      • 2015-02-24
      • 2014-10-15
      • 2011-08-10
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多