【问题标题】:Did Git change the "!" prefix behavior at .gitignore?Git是否更改了“!” .gitignore 的前缀行为?
【发布时间】:2019-05-14 03:48:53
【问题描述】:

我在 Git 2.7 Release Notes 中找到了以下句子。

  • 允许后面的 "!/abc/def" 覆盖前面的 "/abc" 出现在同一个 .gitignore 文件中以便于表达 “/abc 目录中的所有内容都将被忽略,除了 ...”。

    Git 2.7 Release Notes

不过,这个功能在后续版本中好像失效了。

$ git --version
git version 2.19.1
$  cat .gitignore
/abc
!/abc/def
$ mkdir abc
$ echo foo > abc/def
$ git status
On branch master
nothing to commit, working tree clean

Git 是否更改了“!” .gitignore 的前缀行为?还是我弄错了?

【问题讨论】:

标签: git gitignore


【解决方案1】:

看起来该更改在 2.8.0 中已恢复,您为什么要梳理两年前的发行说明以查看 gitignore 的行为,而您可以说 git help ignore 它会告诉您

  • 可选前缀“!”这否定了模式;任何被先前模式排除的匹配文件都将再次包含在内。 如果文件的父目录被排除,则无法重新包含该文件。 Git 出于性能原因不会列出排除的目录,因此包含的任何模式文件没有任何作用,无论它们是在哪里定义的。在第一个“!”前面放一个反斜杠(“\”)对于以文字“!”开头的模式,例如“!important!.txt”。

如果您不希望忽略目录修剪,那么执行 gitignore 的简单方法是忽略它们的全部内容

directory/**

后跟任何覆盖(例如您的!directory/def)并在您的 gitignore put 结束时

!*/

之后是您真正想要生效的任何完全排除。

【讨论】:

  • 我想做的事就按你的方式来做!但是,我无法理解最后一个!*/ 的目的。即使在我的环境中没有这个,它似乎也足够移动。
  • 尾部斜杠是仅目录标记,*/ 仅匹配目录,!*/ 表示从不匹配目录(除非后续匹配覆盖它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多