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

时间:2010-09-30 18:16:18

标签: git

我将以下行添加到.gitignore,但是当我键入git status时,它会将该文件显示为非暂存文件。有什么问题?所有其他模式都运作良好。

.gitignore文件内容:

sites/default/settings.php

14 个答案:

答案 0 :(得分:247)

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

如果这不起作用,那么Git可能已经跟踪了您的文件。您可以通过git status的输出进行确认。如果该文件未列在“未跟踪文件”部分中,则Git已经跟踪该文件,它将忽略.gitignore文件中的规则。

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

为了实际忽略该文件,您必须将其删除并将其从存储库中删除。您可以使用git rm --cached sites/default/settings.php执行此操作。这将从存储库中删除文件而不会物理删除文件(这就是--cached所做的)。提交更改后,该文件将从存储库中删除,忽略它应该可以正常工作。

答案 1 :(得分:87)

我遇到这个问题,这是一个老问题,但我希望跟踪该文件,但不要在某些工作副本上跟踪它,为此可以运行

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

答案 2 :(得分:35)

.gitignore只会忽略您尚未添加到存储库的文件。

如果您执行了git add .,并且该文件已添加到索引中,.gitignore将无法帮助您。你需要git rm sites/default/settings.php删除它,然后它将被忽略。

答案 3 :(得分:24)

请使用此命令

git rm -rf --cached .
git add .

有时.gitignore文件即使正确也无法正常工作。 Git忽略文件的原因是它们没有添加到存储库中。如果您添加了以前要忽略的文件,则Git将对其进行跟踪,并且所有跳过的匹配规则都将被跳过。 Git这样做是因为文件已经是存储库的一部分。

答案 4 :(得分:10)

我遇到了同样的问题。 .gitingore中定义的文件,在运行git status时列为未跟踪文件。

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

.gitignore文件的编码更改为UTF8后,它对我有效。

答案 5 :(得分:2)

我成功忽略了 settings.php 文件的操作:

  1. git rm-缓存的站点/default/settings.php
  2. 提交(到目前为止,此操作无效)
  3. 手动删除的sites / default / settings.php(这可以解决问题)
  4. git add。
  5. 提交(成功忽略)

我认为,如果Git上存在已提交的文件,则忽略无法按预期工作。只需删除文件并提交即可。之后,它将忽略。

答案 6 :(得分:1)

我刚用git 1.7.3.1尝试了这个,并给出了如下结构:

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

其中repo因此是上面提到的“根”(我将其称为工作树的根),而.gitignore仅包含sites/default/settings.php,忽略对我有效(是否将.gitignore添加到仓库并不重要。这与你的回购布局相符吗?如果没有,有什么不同?

答案 7 :(得分:1)

确保.gitignore没有扩展程序!!它不能是.gitignore.txt,在Windows中只是命名文件.gitignore。它会起作用。

答案 8 :(得分:0)

以防将来有人遇到与我相同的问题:

如果您使用

*
!/**/
!*.*

删除没有扩展名的二进制文件的技巧,确保所有其他gitignore行都在下面。 Git将从顶部读取.gitignore,所以即使我在我的gitignore中有'test.go',它仍然是文件中的第一个,并且在

之后变得“无人”。
!*.*

答案 9 :(得分:0)

有实例,例如我想在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

上面的Mescalito有一个很好的答案,这使我走了正确的路,但是

git update-index-假设未更改的文件/to/ignore.php

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

但是,我更改了文件的内容,所以在我的情况下--skip-worktree是更好的选择。

西那敏治(Toshiharu Nishina)的网站很好地解释了跳过工作树与假设不变的情况:Ignore files already managed with Git locally

答案 10 :(得分:0)

另一个可能的原因一些同时运行git客户端的实例。例如“ git shell” +“ GitHub Desktop”等。


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

  1. 您承诺某事。
  2. 接下来,提交:它将忽略.gitignore设置。提交包括.gitignore中提到的许多临时文件。
  3. 清除git缓存;检查.gitignore是否为UTF8;删除文件->提交->将文件移回;跳过1次提交-没有帮助。

原因:Visual Studio Code编辑器在后台运行且具有相同的打开的存储库。 VS Code具有内置的git控件,这会引起一些冲突。

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

答案 11 :(得分:0)

我在VS Code终端上尝试了上述大多数命令,但出现类似以下错误:

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

我在GitHub Desktop上打开了该项目,然后从那里忽略了它,

答案 12 :(得分:0)

我认为,此处的出色答案中缺少的一件事是,如果another *.gitignore* or multiple of them.

在一种情况下,我克隆了一个存储库,无法弄清为什么在运行 git add 时再次添加“忽略的”文件。结果表明,子文件夹中还有一个 .gitignore ,并且该文件覆盖了根文件夹中的那个。

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

The

root /.gitignore

忽略了此文件保存阶段

The

/some-folder/.gitignore

没有说明可以忽略“此文件保存阶段”文件。

因此是问题。

其中之一是简单地在层次结构中搜索多个.gitignore文件。并找出适用的规则。

答案 13 :(得分:0)

一个棘手的问题是,如果您执行诸如 echo node_modules >> .gitignore 之类的操作,它将不起作用。 Windows 终端将文件保存在 UCS-2 LE BOM 中,而 git 似乎不接受。

您可以使用 Notepad 打开文件并使用 UTF-8 编码保存

notepad save utf-8 encoding

现在可以使用了。

我认为他们需要解决这个问题,因为 echo "filetoignore" >> .gitignore 实际上看起来很方便