为什么git会忽略未在.gitignore文件中的文件?

153

我有一个 git 仓库,它忽略了图像文件以及其他一些文件,但是我的 .gitignore 文件只忽略了一个 config.php 文件。是否有某个全局忽略文件我找不到?现在我必须指定文件才能添加它们,这让我收到以下警告:

以下路径被您的 .gitignore 文件之一忽略。

我的 ~/.gitconfig 文件中只有我的电子邮件地址。


相关:https://dev59.com/jWct5IYBdhLWcg3wXsQy - krlmlr
15个回答

256

git check-ignore

使用git check-ignore命令来调试你的.gitignore文件(排除文件)。

例如:

$ git check-ignore -v config.php
.gitignore:2:src    config.php

以上输出详细描述了每个给定路径名(包括行号)的匹配模式(如果有的话)。

因此,也许不是忽略了您的文件扩展名,而是整个目录被忽略了。

返回格式如下:

<source> <COLON> <linenum> <COLON> <pattern> <HT> <pathname>

您可以使用以下命令来打印您的.gitignore文件在用户HOME和仓库文件夹中:

cat ~/.gitignore "$(git rev-parse --show-toplevel)"/.gitignore "$(git rev-parse --show-toplevel)"/.git/info/exclude

或者,您可以使用git add -f命令,该命令允许添加被忽略的文件。

更多详情请参考:man gitignoreman git-check-ignore

语法

git check-ignore [选项] pathname…​

git check-ignore [选项] --stdin


5
这比被接受的答案好得多。没有冒犯那个回答者的意思,但这个答案救了我的一天。谢谢 kenorb。 - luanjunyi
1
值得更多的点赞。发现一些/vendor/文件夹中的奇怪gitignore导致最新的git版本出现问题。 - Manuel Arwed Schmidt
3
今天它救了我一命……看起来Visual Studio在用户文档文件夹中创建了一个名为gitignore_global.txt的文件,导致我无法(取消)忽略某些文件。我没法解释更多了,请让我知道您是否需要翻译其他内容。 - Samuel
1
完美地解决了我的问题。有些模式不容易被肉眼捕捉到!! - Willa
你的回答帮了我很多。从现在开始,我会在我的gitignore文件顶部添加两个注释:#Git正在忽略不在gitignore中的文件,然后是此答案的URL。 - Karl

58

你可能会想知道,你的git配置文件可以包含一个core.excludesfile,这是一个忽略额外模式的路径文件。你可以通过运行以下命令(在有问题的git存储库中)来查看是否有这样的配置:

值得一提的是,你的git配置文件可以包含一个core.excludesfile属性,指向一个包含额外被 Git 忽略的模式列表的文件。如果您在问题存储库中执行以下命令,则可以查看是否存在此类配置:

git config core.excludesfile
如果打印出文件路径,请查看该文件的内容以获取更多信息。
在我的情况下,我通过旧版本的boxen安装了git,它忽略了我的情况下给我警告的模式'Icon?',这个问题在我的文件夹图标中提到(我使用一个不区分大小写的文件系统,所以Icon?与icons匹配)。

2
这确实是我的问题。不确定这个文件何时或如何被编辑,但它列出了我想要的文件。 - toxaq
3
谢谢你,你帮我省去了数小时的痛苦。在我的情况下,安装了 SourceTree(一款用于可视化 Git 仓库的工具),它不合理地在文档文件夹下创建了一个 gitignore_global.txt 文件,其中包含了大量的排除内容。 - Mechanical Object
我遇到了同样该死的 Icon? 被忽略的问题。 - Justin Skiles
这对我来说也是一样的。全局忽略文件内有相当多的规则。感谢建议 +1。 - Madness
我在我的全局忽略文件中有一个*.json - 真是噩梦 - 谢谢! - Jason Perfetto
这个!一些愚蠢的脚本在我的用户文件夹中创建了 .gitignore 并将 "*" 添加到其中。 - IvanD

34

请看一下这些内容:

  1. 你是否查找了其他.gitignore文件,因为可能存在许多这样的文件。

  2. 另外,请查看REPO/.git/config以查看是否有任何内容。

  3. Repo排除本地每个存储库规则可以添加到您存储库中的.git/info/exclude文件中。这些规则不会与存储库一起提交,因此它们不会与其他人共享。此方法可用于局部生成的文件,您不希望其他用户生成,例如由编辑器创建的文件。


仓库中没有其他的 .gitignore 文件,.git/config 文件中也没有忽略任何内容的设置。.git/info/exclude 是如何配置的? - Ian Hunter
4
为什么这个回答被标记为已解决还不清楚。那么这个问题到底是如何解决的呢? - Next Developer
排除是我的问题。我知道还有另一种忽略的方法,我以前用过,但忘记了它在哪里! - Chucky

23

我遇到了相同的问题 - 在 git 中出现以下错误,该目录被忽略:

 git add app/views/admin/tags/
The following paths are ignored by one of your .gitignore files:
app/views/admin/tags
Use -f if you really want to add them.
fatal: no files added

我终于弄清楚了我的问题出在~/.gitignore_global的一行代码上:

TAGS

该路径为app/views/admin/tags。我通过在全局的gitignore文件中添加一个前导斜杠来解决了这个问题。

/TAGS

然后git重新开始跟踪我的目录。


3
谢谢你让我寻找部分匹配项... gitignore_global.txt 文件中包含了 "[Rr]elease*/",导致我的 "releasenotes" 目录被忽略掉了。 - Trev
为了让事情更加困难,git 只会忽略新添加的文件,而不是已经在仓库中的文件。因此,当我将 "foo/" 添加到我的 .gitignore 文件中时,它只会忽略 foo 子目录中最近添加的文件,而不是所有文件。花了我一个小时才弄清楚为什么有些文件被忽略了,而其他文件没有。 - ccleve
我有同样的问题。SourceTree在Tools菜单->Options项目->Git选项卡中设置了~/.gitignore_global文件。清空全局忽略列表后,“git add…”命令就可以正常工作了。 - Kate
我也遇到了同样的问题。我有一个名为 help 的目录,但它被忽略了。幸运的是,我很快就找到了你的答案。 - Abdul Sadik Yalcin

11

对我来说,我的~/.gitignore_global文件中意外地有一个通配符。也许可以在那里检查一下?


1
这正是我的问题所在。我有*.png文件,不知道它是怎么出现的。 - Shahar

3
在我的情况下,路径中的斜杠导致了问题...
无法工作。
/srv/bootstrap/

工作

srv/bootstrap/

3

另一个尝试的方法:我有一个目录B,它有自己的.git嵌套在我的项目目录A下(但不是作为子模块)。我对B进行了一些更改,并希望将其变成一个真正的子模块。我认为git A自动忽略B,因为它包含自己的存储库(请参见无子模块的嵌套git存储库? )。我重命名了B文件夹,并尝试将其再次克隆为子模块,这会带来误导性的“被.gitignore忽略”的错误消息。解决方案是从B中删除.git


3

可能不仅是 .gitignore: skip-worktreeassume-unchanged

文件可能因以下原因被忽略:

  1. .gitignore (所有内容的组合)
  2. git update-index --skip-worktree
  3. git update-index --assume-unchanged

此外,如果文件在 .gitignore 中并且已经在索引 / 缓存中暂存,则可以取消忽略该文件。

要检查上述列出的情况:

  1. 对于两种 .gitignore 排除的情况,请比较以下命令的输出:

    • git check-ignore --verbose --non-matching --no-index file1 file2 file3
    • git check-ignore --verbose --non-matching file1 file2 file3
  2. git ls-files file1 file2 file3 | grep -E '^S'

  3. git ls-files file1 file2 file3 | grep -E '^[[:lower:]]'

太复杂了,给我一个别名吧!

以下别名将涵盖上述所有情况:

ignore = !"bash -c 'diff --unified=999999999 --color=always <(echo a; git check-ignore --verbose --non-matching --no-index . \"$@\") <(echo b; git check-ignore --verbose --non-matching . \"$@\")' - \"$@\" | tail -n+7; git hidden \"$@\" # Show ignore status of arguments. Files included by index are tagged with prepended '+'."
hidden = !"git ls-files -v -- \"$@\"| grep -E '^(S|[[:lower:]])' # S means update-index --skip-worktree, and lower first letter means --assume-unchanged."

注释和最后的"是要复制到你的.gitconfig文件中的一行内容。

用法:

git ignore file1 file2 file3

2
我和你一样遇到了同样的问题。你收到的唯一回复列出了一些要检查的地方,但对我来说都没有解决问题,而根据你的评论,我认为对你也是如此。我在目录树中没有其他的 .gitignore 文件;.git/config 中也没有;.git/ignore/exclude 中也没有。
如果你仍然有这个问题,请看this answer。它为我解决了这个问题。
基本上,要检查 ~/.gitignore 文件。我的叫做 ~/.gitignore_global。我不知道它是何时创建的(当然不是我创建的),但我在安装时尝试了许多不同的 git 设置,所以其中一个肯定把它放在那里了。
希望他的回答也能帮助到你!

1

当执行git submodule add命令时,如果之前的一个git命令崩溃并留下了锁文件,你也会收到来自git的错误消息(这可能发生在你使用包含git命令且没有注意到崩溃的自定义脚本时)。

如果条件没有改变(git submodule add 会继续抱怨你的 .gitignore 文件有问题),而你执行git commit命令,则会看到另一个错误报告:

$ git commit -a
fatal: Unable to create '..../.git/index.lock': File exists.

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

实际上,删除锁文件:
rm .git/index.lock

解决了这个问题。(这个问题出现在git版本2.1.0.9736上,可能会在未来的git版本中得到修复。)


谢谢,这正是我遇到的问题。救命稻草! - JDawgg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接