[笔记:这不是常见的“Git 仍然跟踪我刚添加到 .gitignore 的文件!”问题。这与此相反。]
我在 Git 存储库中有一个网站的完整目录结构。我使用的 CMS 默认带有一个 .gitignore 文件:
# Ignore paths that contain user-generated content.
sites/*/files/
sites/*/private/
请注意,所有 sites/*/files 目录均被排除。但是,我处理网站的方式是,我希望将某个子文件夹包含在存储库中。因此,在使用上述 .gitignore 启动存储库后,我将其修改为:
# Ignore paths that contain user-generated content.
sites/*/files/
!sites/*/files/content/
!sites/*/files/content/*
sites/*/private/
据我理解,我上面添加的否定模式应该意味着 sites/*/files/content/ 及其内容包含在存储库中,但 sites/*/files 的其余部分将被忽略。当我记得在进行第一次提交之前更新 .gitignore 文件时,它按计划运行。
但是当我忘记稍后更新 .gitignore 时(我习惯这样做),我无法让 Git 添加新文件,除非强制它完全忽略 .gitignore 文件。我运行这个:
> git add sites/default/files/content/
然后得到这个:
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
是的,Git,为什么那个目录在 .gitignore 的第 2 行被忽略了,但是第 3 行和第 4 行却说要对我询问您的特定文件夹做出例外!
我知道我可以使用 -f 直接添加它,但是以后每次将文件添加到该目录时我都必须一次又一次地执行此操作。
有页面全部 超过 这 网络讨论了更新 .gitignore 如何不会使 Git 忽略已跟踪的文件,但我找不到任何关于它如何不会使 Git 跟踪新排除的文件的内容。
很多地方都说git update-index
可以用它解决这类问题,但我似乎无法让它为我工作。它有大约一百万个可能的标志,所以也许我没有偶然发现正确的标志(或多个标志的组合)。
总结:如何让 Git 观察我的 .gitignore 文件中的新排除项?
答案1
我认为这个答案解释得最好。否定仅适用于重新包含已被另一条规则明确忽略的文件。当您忽略封闭目录时,Git 甚至不会深入其中,因此永远不会看到或明确排除您的文件。
上面的答案为您提供了解决方案:您必须创建一个或多个规则,这些规则构建一组路径,明确排除您想要排除的所有内容包括你的文件此时您可以否定对它或它的任何包含目录的排除。
答案2
Google 让我来这里寻找类似问题的答案。我只想跟踪未修改库中的单个配置文件。
为了实现这一点,我必须包含/排除每个文件夹,直到我想要排除的文件:
vendor/* !vendor/tfox/ vendor/tfox/* !vendor/tfox/mpdf-port-bundle/ vendor/tfox/mpdf-port-bundle/* !vendor/tfox/mpdf-port-bundle/TFox/ vendor/tfox/mpdf-port-bundle/TFox/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/ vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/ vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/config_fonts.php
这套规则看上去很笨重,但这似乎是正确的做法。