Git忽略了不在gitignore中的文件

时间:2012-02-24 18:56:07

标签: git gitignore

我有一个git存储库忽略了图像文件以及一些其他文件,但我的.gitignore文件只忽略了config.php文件。是否有一些我无法找到的全局忽略文件?我必须指定要立即添加的文件,它会给我这个警告:

  

您的.gitignore文件会忽略以下路径。

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

14 个答案:

答案 0 :(得分:140)

git check-ignore

使用git check-ignore command调试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 check-ignore [options] pathname ...

     

git check-ignore [options] --stdin

答案 1 :(得分:48)

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

git config core.excludesfile

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

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

答案 2 :(得分:30)

检查这些:

  1. 您是否找过其他.gitignore文件,因为可能有很多文件。

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

  3. Repo排除本地per-repo规则可以添加到repo中的.git / info / exclude文件中。这些规则不会与回购协议一起提交,因此不会与其他人共享。此方法可用于您不希望其他用户生成的本地生成的文件,例如编辑器创建的文件。

答案 3 :(得分:21)

我遇到了同样的问题 - 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再次开始跟踪我的目录。

答案 4 :(得分:6)

对我来说,我在〜/ .gitignore_global文件中偶然出现了一个通配符。也许检查一下?

答案 5 :(得分:3)

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

答案 6 :(得分:2)

我遇到了与你完全相同的问题。你列出的唯一答案列出了几个地方要检查,但没有一个为我解决问题,从你的评论中我也没有想到你。我没有在目录树中隐藏较低的其他.gitignore文件; .git / config中没有任何内容.git / ingore / exclude

中没有任何内容

如果问题仍然存在,请检查this answer。它解决了我的问题

基本上,检查〜/ .gitignore文件。我叫做〜/ .gitignore_global。我不知道它何时被创建(当然没有制作它),但是我在第一次安装时尝试了大量不同的git设置,所以其中一个必须把它放在那里。

希望他的回答能帮到你!

答案 7 :(得分:1)

从git接收此错误消息的另一个原因是,当前一个git命令崩溃并且离开锁定文件时执行git submodule add命令(这可能发生,例如,当您使用包含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.

确实删除了lockfile:

rm .git/index.lock

解决了这个问题。 (这适用于git版本2.1.0.9736。可能会在将来的git版本中修复。)

答案 8 :(得分:1)

检查您是否拥有该文件夹的权限。我刚刚遇到这个问题,原因是该文件夹归www-data用户所有,而不是我登录终端的用户。

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

另请检查可能由某些Git客户端创建的~/.gitignore~/.gitignore_global(例如Mac OS X上的Atlassian SourceTree)。

答案 12 :(得分:0)

确保.gitignore文件不会忽略自身。 常见的错误是向*文件添加.gitignore规则以忽略当前文件夹中的每个文件。 解决方案是向.gitignore添加例外:

*
!.gitignore

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

答案 13 :(得分:0)

在我的情况下,这是我路径中的正斜线导致问题......

不工作

/srv/bootstrap/

工作

srv/bootstrap/