在
.gitignore
中,我有一条排除路径的规则 settings.php
但是,必须忽略该规则(该文件必须包含在 git 中),但由于特殊原因(
.gitignore
文件经常从外部重置为默认值),我不想更改 .gitignore
本身,但是而不是通过在 core.excludesfile 文件中设置反规则来覆盖它。
因此,在相关的 core.excludesfile 文件中,我输入:
!settings.php
来覆盖上述规则。
但它不起作用。我怀疑.gitignore
中的规则优先于全局文件中排除的规则(这就是我的理解https://www.kernel.org/pub/software/scm/git/docs/gitignore.html ).
有什么方法可以通过 core.excludesfile 或其他地方的规则覆盖 .gitignore 中设置的规则吗?
是的!事实证明,当将文件添加到存储库时,您可以强制它覆盖 .gitignore:
git add -f <filename>
or
git add --force <filename>
来源:https://www.kernel.org/pub/software/scm/git/docs/git-add.html
有一种简单的方法可以覆盖 .gitignore 文件中的规则——只需在更深层次上创建一个新的 .gitignore 文件即可。例如。就我而言,我可以通过将
!settings.php
添加到 settings.php 所在文件夹中的新 .gitignore 文件中来使 git 忽略我的 settings.php 文件。
参考:https://git-scm.com/docs/gitignore
可选前缀“!”这否定了模式;先前模式排除的任何匹配文件将再次包含在内。如果排除某个文件的父目录,则无法重新包含该文件。出于性能原因,Git 不会列出排除的目录,因此包含文件上的任何模式都无效,无论它们是在哪里定义的。在第一个“!”前面放置一个反斜杠(“”)。对于以文字“!”开头的模式,例如“!important!.txt”。
对于那些不介意修改
.gitignore
文件的人,您可以通过在文件名或文件夹前面添加 !
来覆盖规则。使用 *
选择文件夹中的文件,使用 **
递归选择子文件夹中的文件。
覆盖特定文件的忽略:
!file.js
覆盖目录中文件的忽略:
!assets/*
覆盖目录及其子目录中文件的忽略:
!assets/**
gitignore 不够复杂,无法处理您试图通过重置
.gitignore
文件并排除某些忽略文件等来解决的用例。对于您使用 settings.php
的用例,更典型的方法是提交模板化版本 settings.php.example
并使用 make
等工具或其他模板语言在构建时生成 settings.php
。本示例中的设置值将存储在其他一些配置文件或环境变量中,出于安全原因,这些配置文件不会提交给 git。[直接引用@Wade_Williams评论https://stackoverflow.com/questions/24844782/how-to-override-a-rule-set-in-gitignore#comment93792098_24844782到其他答案之一]