git 添加 . (dot) 不服从 .gitignore (或者我的模式是错误的)

git add . (dot) doesn't obey .gitignore (or my patterns are wrong)

我有以下情况。在我的 asp.net webforms 项目中,我有一些共享存储库,我可以选择使用 我的主要存储库下。这些文件夹被命名为 Shared,然后是 Shared.*。例如,我有一个这样的文件夹结构。

\main  
.. \.git  
.. \main-subfolder  

.. \Shared (this should be ignored since own repo)  
.... \.git  
.... \Shared-subfolder  
.... shared files  

.. main-files

我认为我正在使用的这种模式可能类似于 git 子模块,但(希望)留待另一次讨论。

我的 .gitignore 文件最初只有:Shared*/ 并且一切正常。

然后我发现在我的 asp mvc 项目中,我的 Views/Shared 文件夹被忽略了(正如上述模式预期的那样)。所以我尝试用 !Views/Shared/ 添加一个排除项,但这没有用,因为 git 仍然没有检测到它应该添加 Views/Shared 的 mvc 项目内容。

所以我得到了:

Shared*/*
!Views/Shared/

一切似乎都有效,但是,我在我原来的 webforms 项目中发现了一个问题(应该忽略 Shared* 的文件夹)。于是下图。 git status 似乎正确地忽略了共享文件夹,但是当我执行 git add . 然后 git status 时,您可以看到它已被添加。

注意:git com -am "Commit Message" 似乎也有效。如果那是我最初的步骤而不是 git add .,提交时将忽略 Shared 文件夹。

我的设置(嵌套存储库)不受支持还是我的 .gitignore 模式不正确?提前致谢。

即使我复制了您正在查看的内容,我也感到困惑。我的同情。 git 在这里做的一些事情迎合了深奥的用法(并且可以说应该不是它的默认行为),并且路径名锚定只是古怪。

tl;dr,根据评论和示例,我认为您想要:

Shared*/
!**/Views/Shared*/

所以,令人困惑的部分:

git status 默认情况下 (-u normal) 根据其中是否有任何 文件 选择要显示的(未忽略和)未跟踪目录git add 没有强制——这与检查其中是否有任何未跟踪的子模块不同。有时绕过未跟踪的子模块边界很有用,但在我看来,一个朴素的 git status 报告并不是默认情况下这样做的好地方。

其次,git 的模式匹配需要前导 / 以将普通名称锚定在模式根(.gitignore 位置或其他来源的工作树顶部),但是嵌入 / 的路径总是锚定在模式根部,因此要在任何地方排除多部分路径模式,请在其前面加上 **/。我不想与任何坚持认为这违反了最少惊喜原则的人争论...