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

我有一个 git 存储库,它忽略了图像文件以及一些其他文件,但是我的 .gitignore文件只忽略了一个 config.php文件。是不是有什么全局忽略文件我找不到了?我现在必须指定文件来添加它们,它给了我这样的警告:

下列路径被. gitignore 文件之一忽略。

~/.gitconfig文件的内容只是我的电子邮件地址。

59006 次浏览

看看这些:

  1. 你有没有寻找其他。吉蒂诺尔文件,因为它们可能有很多。

  2. 另外,查看 REPO/. git/config,看看那里是否有什么东西。

  3. 排除本地每次回购规则可以添加到。回购文件中的 git/info/ 。这些规则不与回购协议一起承诺,因此不与他人共享。此方法可用于本地生成的文件,您不希望其他用户生成这些文件,如编辑器创建的文件。

我和你的问题一模一样。你得到的唯一的回复列出了几个地方去检查,但没有一个为我解决了问题,从你的评论来看,我也不认为为你解决了问题。我没有别人。目录树下面隐藏的 gitignore 文件; 中没有。Git/config; 中没有内容。Git [不理会][排除]

如果你仍然有问题,检查 这个答案。它为我解决了问题

基本上,检查一个 ~/。吉蒂诺档案。我的叫做 ~/。Gitignore _ global.我不知道它是什么时候创建的(肯定没有创建它) ,但是当我第一次安装它的时候,我尝试了大量不同的 git 设置,所以它们中的一个一定把它放在了那里。

希望他的回答对你也有帮助!

我遇到了同样的问题—— 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

我通过在全局 gitignore 文件中添加一个前斜杠来修复它

/TAGS

Git 又开始追踪我的目录了。

最好知道您的 git 配置可以包含一个 core.excesfile,它是一个文件的路径,其中包含被忽略的其他模式。您可以通过运行(在有问题的 git repo 中)来查明是否有这样的配置:

git config core.excludesfile

如果它打印文件路径,请查看该文件的内容以获取更多信息。

在我的例子中,我通过一个旧版本的 盒子安装了 git,它忽略了模式‘ Icon?在我的情况下,给我的警告,在这个问题中提到,为一个文件夹图标(我在一个不区分大小写的文件系统,这就是为什么图标?匹配图标)。

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

从 git 接收到这个错误消息的另一个原因是,在执行 git submodule add命令时,以前的 git 命令已经崩溃并且离开了锁文件(例如,当您使用包含 git 命令的自定义脚本而没有注意到崩溃时,就会发生这种情况)。

如果改为执行命令 git commit,而所有条件都没有改变(git submodule add会一直大声说是 .gitignore文件的错) ,那么您将看到 另一个错误报告:

$ 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 版本中可能会修复这个问题。)

也请检查 ~/.gitignore~/.gitignore_global,它们可能是由一些 Git 客户端创建的(例如 Mac OS X 上的 Atlassian SourceTree)。

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>

或者使用以下命令在用户 HOME 和存储库文件夹中打印 .gitignore:

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 检查-忽略[选项]路径名..

Git check-忽略[选项]—— stdin

Check you have permission to the folder. I have just run into this and it was because the folder was owned by the www-data user not the user I was logged in to the terminal as.

确保 .gitignore文件没有忽略它本身。 一个常见的错误是向 .gitignore文件添加 *规则以忽略当前文件夹中的每个文件。 解决这个问题的方法是向 .gitignore添加一个异常:

*
!.gitignore

这样,除了 .gitignore之外,目录中的所有文件都将被忽略。

在我的例子中,是路径中的正斜杠导致了问题..。

不是工作

/srv/bootstrap/

工作

srv/bootstrap/

对于我来说,我不小心在 ~/. gitignore _ global 文件中有一个通配符?

还有一件事: 如果您所在的目录需要 root 访问才能写入或执行,那么请确保您是在 root 用户上。我实际上得到了一个奇怪的错误,当我试图添加一个子模块时,git 一直抱怨我正在克隆的路径被 git 忽略文件忽略了。然后我更改为 root 用户,再次运行子模块 add,没有问题。

可能不是 .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

检查一下你是否在右边的树枝上。