为什么Git不忽略我指定的文件?

我在.gitignore中添加了以下一行:

sites/default/settings.php

但是当我输入git status时,它显示该文件为非暂存文件。

有什么问题吗?所有其他模式都很好。

217607 次浏览

确保你的.gitignore在工作目录的根目录下,并在该目录中运行git status复制状态输出文件的路径,并将其粘贴到.gitignore中。

如果这不起作用,那么很可能您的文件已经被Git跟踪了。你可以通过git status的输出来确认这一点。如果文件不在“无路径的文件”部分中列出,那么Git已经跟踪它了,它将忽略.gitignore文件中的规则。

在Git中忽略文件的原因是它们不会被添加到存储库中。如果您之前添加了一个想要忽略的文件,那么Git将跟踪它,并跳过与之匹配的忽略规则。Git这样做是因为该文件已经是存储库的一部分。

为了实际忽略该文件,必须取消跟踪并将其从存储库中删除。你可以通过使用git rm --cached sites/default/settings.php来做到这一点。这将从存储库中删除文件,而不实际删除文件(这就是--cached所做的)。提交更改后,该文件将从存储库中删除,忽略它将正常工作。

我刚刚尝试了git 1.7.3.1,并给出了这样的结构:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

其中repo因此是上面提到的“根”(我会称它为你的工作树的根),而.gitignore只包含sites/default/settings.php,忽略为我工作(无论.gitignore是否被添加到回购)。这与你的回购布局匹配吗?如果不是,有什么不同?

.gitignore将只忽略你还没有添加到存储库的文件。

如果你做了git add .,文件被添加到索引中,.gitignore不会帮助你。你需要执行git rm sites/default/settings.php来移除它,然后它将被忽略。

我遇到了这个问题,这是一个老问题了,但是我想要跟踪那个文件但不是在某些工作副本上跟踪它,你可以这样做

git update-index --assume-unchanged sites/default/settings.php

确保.gitignore没有扩展名!!它不能是。gitignore。txt,在windows中只是命名为。gitignore。它会起作用的。

我也有同样的问题。
.gitingore中定义的文件在运行git status时被列为未跟踪的文件

这是因为.gitignore文件以UTF-16LE编码保存,而不是以UTF8编码保存。

在将.gitignore文件的编码更改为UTF8之后,它工作了。

以防将来有人遇到和我一样的问题

如果你使用

*
!/**/
!*.*

移除没有扩展名的二进制文件的技巧,确保所有其他gitignore行都在下面。Git会从顶部读取。gitignore,所以即使我有'test. Git '。“Go”在我的gitignore中,它是文件中的第一个,然后变成了“不可忽视”

!*.*

我成功忽略settings.php文件所做的事情:

  1. Git rm—cached sites/default/settings.php
  2. 提交(到此为止没有工作)
  3. 手动删除sites/default/settings.php(这是有效的)
  4. Git添加。
  5. 提交(成功忽略)

我认为如果Git上有提交文件,那么忽略就不能正常工作。只需删除文件并提交。之后它会忽略。

有一些实例,例如应用程序配置文件,我想在git中跟踪(因此.gitignore将不起作用),但我需要更改本地设置。我不希望git管理这些文件或将其显示为修改。要做到这一点,我使用skip-worktree:

git update-index --skip-worktree path/to/file

您可以通过列出文件并检查以S开头的行是否被跳过来确认文件被跳过

git ls-files -v | grep ^S

如果将来你想让git再次在本地管理文件,只需运行:

 git update-index --no-skip-worktree path/to/file

上面的麦斯卡利托给出了一个很好的答案,引导我走上了正确的道路,但是

Git update-index——assume-unchanged file/to/ignore.php

与git有一个合同,其中:用户承诺不更改文件,并允许git假设工作树文件与索引中记录的文件匹配。

然而,我改变了文件的内容,所以在我的例子中——skip-worktree是更好的选择。

Toshiharu Nishina的网站提供了一个关于skip-worktree和assume-unchanged的很好的解释:忽略已经在本地用Git管理的文件

__abc0 - __abc1。例如“git shell”+“GitHub Desktop”等。


这发生在我身上,我使用“GitHub Desktop”作为主要客户端,它忽略了一些新的。gitignore设置:

  1. 你做出了承诺。
  2. 接下来,提交:它忽略.gitignore设置。提交包含了.gitignore中提到的大量临时文件。
  3. 清除git缓存;检查.gitignore是否是UTF8;删除文件->提交->移动文件回来;跳过承诺——没有任何帮助。

原因: Visual Studio代码编辑器正在后台运行,使用相同的打开的存储库。VS Code有内置的git控件,这会产生一些冲突。

解决方案:仔细检查多个隐藏的git客户端,一次只使用一个git客户端,特别是在清理git缓存时。

我在VS Code终端上尝试了上面的大多数命令,我得到了如下错误:

fatal: pathspec '[dir]/[file]' did not match any files

我在GitHub Desktop上打开了这个项目,然后忽略了它,它工作了。

请使用此命令

git rm -rf --cached .
git add .

有时.gitignore文件即使是正确的也不能工作。Git忽略文件的原因是它们没有被添加到存储库中。如果您之前添加了一个想要忽略的文件,Git将跟踪它,并且将跳过任何跳过的匹配规则。Git这样做是因为该文件已经是存储库的一部分。

我认为在这里的优秀答案中漏掉了一件事,那就是另一个 .gitignore或多个的存在。

在一个案例中,我克隆了一个回购,不知道为什么a“忽略”;运行git添加时,文件再次被添加。它计算出在子文件夹中有另一个.gitignore,并且覆盖了根文件夹中的那个。

/.gitignore
/some-folder/.gitignore
/some-folder/this-file-keeps-getting-staged

根/ .gitignore

正在忽略this-file-keeps-getting-staged

一些文件/ .gitignore

没有一个规范可以忽略“this-file-keeps-getting-staged"文件。

这就是问题所在。

其中一件事就是在层次结构中搜索multiple .gitignore文件。找出适用的规则。

一个棘手的问题是,如果你做类似echo node_modules >> .gitignore的事情,它将不起作用。windows终端将文件保存在UCS-2 LE BOM中,git似乎不接受这一点。

你可以用Notepad打开文件,并用UTF-8编码保存它

notepad save utf-8 encoding

现在起作用了。

我认为他们需要修复这个问题,因为echo "filetoignore" >> .gitignore实际上似乎是一个方便的事情