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


191

我将以下行添加到.gitignore

sites/default/settings.php

但是当我键入git status它时,该文件显示为未暂存的文件。

有什么问题?所有其他模式都运作良好。



我遇到了同样的问题,然后我发现我将.gitignore文件保存在其他驱动器上:face-palm:
Henry Chan

将内容保留在存储库中并忽略对其所做的更改是一个非常糟糕的主意。
Yevgeniy Afanasyev'17年

Answers:


364

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

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

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

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


“工作目录的根目录”是什么意思?找到“ .git”存储库的目录?
乔纳森·莱夫勒

工作目录是目录所在的目录,.git目录本身就是存储库的根目录。当你克隆一个仓库像/xy/然后/xy/与你的工作目录/xy/.git/中。

3
有时候你还需要还做了git add .之后git rm --cached才能正常重建索引。
库珀

在git状态下检查它的想法很棒。我一直在Eclipse的Git Staging中检查它,并且路径不正确。谢谢!
walla '16

1
我还需要添加-r(递归)标志,因为我也已检查了嵌套文件夹。就我而言,我移至git文件夹的根目录,然后运行命令git rm --cached -r .vs /,其中vs是要从跟踪中删除的顶级文件夹。
Devology Ltd

105

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

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

5
这就是我一直在寻找的答案。所有其他答案都假定该文件是使用git add添加的,并非总是如此。在Acquia Cloud中,.gitignore文件应该忽略settings.php(例如),但该文件包含在第一次提交中。取消跟踪文件,只需将其从存储库中删除,从而将其从活动站点中删除...
PatrickS

也对我有帮助-谢谢!投票了。我怀疑虽然它仅适用于本地git repo,并且一旦被其他开发者推送到远程克隆后就不会持久?
伊万

1
是的,它只是本地的。
Mescalito

40

.gitignore将仅忽略尚未添加到存储库中的文件。

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


Thanks.but如何仅从索引而不是从工作目录中删除文件?
Nick.h 2010年

1
git rm应该这样做,但是可能会要求您使用-f选项,该选项会将其从工作目录中删除。除了制作文件的副本,执行git rm -f然后还原副本外,我没有想到其他方法。
jonescb

同样一个人。在某处制作副本,将其删除,提交删除状态,重新添加文件,看看现在如何忽略它们。
Yevgeniy Afanasyev'17年

16

请使用此命令

git rm -rf --cached .
git add .

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


12

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

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

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


我觉得自己像个菜鸟...把它当Windows
Coty Embry

知道为什么文件编码很重要吗?也许无法正确读取路径?
Chargnn

2

我所做的是成功忽略settings.php文件的操作:

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

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


2

有一些实例,例如应用程序配置文件,我想在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是更好的选择。

Nishina Toshiharu的网站很好地解释了跳过工作树与假设不变:忽略已经在本地使用Git管理的文件


2

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


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

  1. 你犯了什么。
  2. 接下来,提交:它忽略.gitignore设置。提交包括.gitignore中提到的许多临时文件。
  3. 清除git缓存;检查.gitignore是否为UTF8;删除文件->提交->将文件移回;跳过1次提交-无济于事。

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

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


1

确保.gitignore没有扩展名!它不能是.gitignore.txt,在Windows中只需将文件命名为.gitignore。它会工作。


0

我刚刚用git 1.7.3.1尝试了一下,并给出了类似的结构:

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

repo因此,上面提到的“根”(我称其为工作树的根)在哪里,并且.gitignore仅包含sites/default/settings.php,ignore对我有效(并且是否.gitignore添加到存储库中都没有关系)。这符合您的回购布局吗?如果没有,有什么不同?


是的。它与您的完全相同,但不起作用。所有其他模式都可以工作。正如我说的,问题肯定与settings.php文件夹有关。
Nick.h 2010年

我觉得将内容保留在存储库中而忽略它的更改是一个非常糟糕的主意。
Yevgeniy Afanasyev

@YevgeniyAfanasyev,除了诸如编译输出,IDE用户设置,由工具链生成的所有其他临时文件之类的东西外……
克里斯·F·卡罗尔

我的意思是保持在存储库中的承诺,而不仅仅是保留在项目文件夹中的文件。为什么在存储库中需要临时文件?
Yevgeniy Afanasyev

0

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

如果您使用

*
!/**/
!*.*

要删除没有扩展名的二进制文件,请确保所有其他gitignore行都在下面。Git将从顶部的.gitignore读取,因此即使我在gitignore中包含“ test.go”,它也位于文件的第一位,而在该文件之后被“忽略”

!*.*

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.