为什么.gitignore没有忽略我的文件?

475
请看下面的图片。我的 .gitignore 文件应该忽略 src/dist 中的所有文件,但实际上并没有。

enter image description here


3
如果您已经添加了这些文件并且git正在跟踪它们,则.gitignore文件无效,因为它是针对未跟踪的文件而设计的。在此处查看一个好的解决方案:https://dev59.com/5mAg5IYBdhLWcg3wYZ-6#23673910 - SRG
14个回答

879

.gitignore 只会忽略尚未添加到仓库中的文件。如果您已经使用 git add 添加了某些文件,它们的更改仍将被跟踪。 要从您的仓库中删除这些文件(但不从您的文件系统中删除),请对它们使用 git rm --cached


93
谢谢。对于我来说,git rm --cached file_name.ext 可以很好地更新一个文件的 .gitignore。 - sybozz
11
我已经这样做了,但 GitHub 仍然想跟踪并添加它们。 - Netside
17
使用命令"git rm -r --cached folder"可以递归地从Git缓存中删除一个文件夹。 - Pablo Pazos
6
git rm -r --cached <FolderName> 起作用了。谢谢。 - Kamlesh
但是,这表明文件节点已被删除,当我执行完此命令后推送我的更改时,服务器上的文件也被删除了:(。还有其他人遇到过这个问题吗? - Cjo
显示剩余8条评论

403

.gitignore文件确保Git不会跟踪未被追踪的文件。

仅将文件夹/文件添加到.gitignore文件中并不能使它们不再被跟踪 -- 它们仍然会被Git所跟踪。

要使这些文件不再被跟踪,需要从存储库中删除在.gitignore文件中列出的已被跟踪的文件, 然后重新添加并提交更改。

最简单、最全面的方法是删除并缓存存储库中的所有文件,然后将它们全部重新添加。.gitignore文件中列出的所有文件夹/文件都不会被跟踪。从存储库的顶层文件夹运行以下命令:

git rm -r --cached .
git add .

然后提交您的更改:

git commit -m "Untrack files in .gitignore"
请注意,任何包含不需要的文件的先前提交记录将保留在提交历史中。在推送到GitHub时,请注意提交历史可能包含.envclient_secret.json文件。最佳实践是在开始项目时创建一个.gitignore文件,并使用您不希望被跟踪的文件夹/文件来填充它。但是,通常需要在意识到正在跟踪和存储不需要的文件后,向.gitignore文件添加内容。

2
谢谢你的回答。这真的很有帮助。不要忘记将仓库推送到git上。 - Chris Reed
1
在使用 git rm -r --cached . 命令后,回滚所有更改也可以重新添加所有不应被 .gitignore 排除的文件。 - AdamHurwitz
4
应将此标记为正确答案。 - iskandarblue
1
这是更完整的答案。 - Rohit Gupta
2
这应该被标记为正确答案。 - Taha Ali
显示剩余4条评论

61

按照以下步骤处理gitignore

  1. 修改.gitignore文件。

  2. 运行git rm -r --cached .命令。

  3. 运行git add .命令。

  4. git commit -m "提交信息"


我不得不添加 git push -u origin main 才能看到更改,但这对我有用,继续加油伙计! - Diego

45

你可以使用这个,

git rm -r --cached ./node_modules

如果你想忽略node_modules,例如


35

如果你的.gitignore文件没有忽略你的文件和目录。

.gitignore只会忽略尚未添加到仓库中的文件。如果你已经将某些文件添加到了git中,它们的修改将被跟踪。对于这样的文件,请使用git rm -r --cached命令从仓库中删除它们(但不会从文件系统中删除)。

git rm -r --cached .        #untrack files
git add .                   #re-adding the files
git commit -m "issue fixed" #commiting changes
git push                    #pushing changes

4
请明确指出,删除文件时应该使用命令后跟要删除的文件名,使用句点(.)可以删除所有已被追踪的文件。例如,rm -r --cached user.json 将取消对 user.json 文件的追踪。 - Muhammad Uzair

32

gitignore只忽略未被跟踪的文件。你的文件标记为已修改——这意味着它们曾经被提交过,现在被git所跟踪。

要忽略它们,首先需要删除它们,git rm,然后提交并忽略它们。


29

首先检查 .gitignore 的编码。
确保编码是 utf-8
然后通过使用 git rm --cached 文件名 取消跟踪不想要的文件。 现在你的问题已经解决了。


3
文件重新编码已经完成了。 - cesarv
+1 ... 我在 MINGW64 shell 中使用 'touch' 命令创建了我的 .gitignore 文件,但没有注意到编码不是 utf-8(因为我已经在 Notepad++ 中打开了 .gitignore 文件,所以检查和更改编码很容易)。真希望我早点谷歌一下。 - Bruce Loth

9

看这里:.gitignore不起作用 特别是ADTC的评论:

确保你的.gitignore文件使用ANSI或UTF-8编码。如果它使用其他编码方式,比如Unicode BOM,Git可能无法读取该文件。- ADTC 2017年12月14日12:39


7

如果你正在使用VS Code:

检查.gitignore文件的编码类型,如果不是UTF-8则更改为该编码类型。 选择重新打开并使用编码选项以更改文件编码。

这对我有用!

enter image description here


0

我曾经遇到过同样的问题,后来发现我没有正确地创建.gitignore文件。

在我的情况下,由于某种原因我创建了一个.gitignore.txt文件。即使您删除'.txt'扩展名并保存它,Git仍将跟踪.gitignore文件中的文件。

尝试通过终端删除旧文件并创建新的.gitignore文件,方法是'touch .gitignore',这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接