Git 没有观察到 .gitignore 中的新异常

Lan*_*der 6 version-control git

[注意:这不是通常的“Git 仍然跟踪我刚刚添加到 .gitignore 的文件!” 问题。这与此相反。]

我在 Git 存储库中有一个网站的完整目录结构。我使用的 CMS 默认带有 .gitignore 文件:

# Ignore paths that contain user-generated content.
sites/*/files/
sites/*/private/
Run Code Online (Sandbox Code Playgroud)

请注意,所有 site/*/files 目录均被排除。但按照我处理网站的方式,我希望将一个特定的子文件夹包含在存储库中。因此,在使用上述 .gitignore 启动我的存储库后,我将其修改为:

# Ignore paths that contain user-generated content.
sites/*/files/
!sites/*/files/content/
!sites/*/files/content/*
sites/*/private/
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我上面添加的否定模式应该意味着sites/*/files/content/及其内容包含在存储库中,但sites/*/files的其余部分被忽略。当我记得在第一次提交之前更新我的 .gitignore 文件时,它会按计划工作。

但是,当我忘记更新 .gitignore 直到后来,正如我习惯做的那样,我无法让 Git 添加新文件而不强制它完全忽略 .gitignore 文件。我运行这个:

> git add sites/default/files/content/
Run Code Online (Sandbox Code Playgroud)

并得到这个回来:

The following paths are ignored by one of your .gitignore files:
sites/default/files
Use -f if you really want to add them.
fatal: no files added
Run Code Online (Sandbox Code Playgroud)

为什么是的,Git,该目录在 .gitignore 的第 2 行被忽略,但第 3 行和第 4 行说要对我问你的特定文件夹进行例外处理!

我知道我可以使用 -f 直接添加它,但随后我必须在将来向该目录添加文件的任何提交中一次又一次地执行此操作。

网络上 很多页面讨论更新 .gitignore 不会使 Git 忽略已跟踪的文件,但我找不到任何讨论它如何不会使 Git 跟踪新排除的文件的内容

很多地方都说git update-index可以用来解决这样的问题,但我似乎无法让它为我工作。它有大约一百万个可能的标志,所以也许我没有偶然发现正确的一个(或几个的组合)。

TL;DR:如何让 Git 观察 .gitignore 文件中的新排除项?

小智 5

我认为这个答案最好地解释了这一点。否定仅适用于重新包含已被其他规则明确忽略的文件。当您忽略封闭目录时,Git 甚至不会深入到该目录,因此永远不会看到或显式排除您的文件。

上述答案下面的答案为您提供了解决方案:您必须创建一个或多个规则,这些规则构建一组路径,明确排除您想要排除的所有内容,包括您的文件,此时您可以否定它或其中任何一个的排除包含目录。

  • 事实上,第二个答案不必要地复杂;第一个答案就是我所需要的。我所要做的就是将上面粘贴的 .gitignore 的第 2 行更改为“sites/*/files/*”,现在一切正常。谢谢! (2认同)