首页 > 解决方案 > Git - 为什么我的源文件被忽略?

问题描述

我正在使用 git 版本 2.15.0.windows.1

我的 gitignore 文件中有以下内容:

#BAM
**/*[Bb][Aa][Mm]/*
!**/*[Bb][Aa][Mm]/*.btt
!**/*[Bb][Aa][Mm]/*.xls
!**/*[Bb][Aa][Mm]/*.xlsx

我的理解是第三行告诉 git 跟踪匹配以 *.btt 结尾的模式的文件。由于前面的原因,这是一个不要忽略的

我的问题是,我的文件eformsV2.btt被忽略了。我使用了git check-ignore命令,它返回的模式如下所示:

在此处输入图像描述

文档(git doc)建议 check-ignore 仅显示它认为被忽略的文件的路径 - 这是正确的,但为什么是! 模式的前缀不会导致文件被跟踪?

标签: gitgitignore

解决方案


我的问题是该文件是否实际上被忽略了。(Gitcheck-ignore会告诉你哪个规则匹配一个文件,即使那是“不要忽略”规则。)

我创建了一个测试目录并将您的示例文件复制.gitignore到其中,然后创建了两个子目录:

$ mkdir eforms eforms/eformsV2.Bam
$ cd eforms/eformsV2.Bam/
$ touch ignoreme
$ touch eformsV2.btt
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        ../
$ git status -uall
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        eformsV2.btt

nothing added to commit but untracked files present (use "git add" to track)
git check-ignore -v eformsV2.btt 
.gitignore:3:!**/*[Bb][Aa][Mm]/*.btt    eformsV2.btt

除了我跑了git status两次并显示(第二个,更详细的-uall变体)eformsV2.btt未被忽略的事实之外,这似乎与您的屏幕截图相匹配。


运行在不显示目录git status -uall时很有用,因为此时您所知道的是:目录中的某些文件不在索引中,但它们也没有被忽略。高层的观点更有意义:git status-uall

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        eforms/

nothing added to commit but untracked files present (use "git add" to track)

由于它本身没有被跟踪的文件——即使这些文件位于子目录 也是如此——Git 将所有此类文件的列表缩写为简单的,而不是。但是指向告诉您为什么忽略文件的行。eforms/eformseforms/eforms/eformsV2.Bam/git check-ignore -v


另请注意,是否存在路径名.gitignore并不影响文件是否被实际跟踪。这是由文件是否在索引中严格控制的。如果路径名存储在索引中,则跟踪文件;如果路径名不在索引中,则文件未被跟踪。该.gitignore条目主要告诉 Git 是否应该抱怨未跟踪的文件。(在某些情况下,它还有一个副作用是允许 Git 破坏文件。)


推荐阅读