忽略已经提交到Git存储库中的文件

2813

我有一个已经初始化的 Git 仓库,并添加了一个 .gitignore 文件。如何刷新文件索引,以便忽略我想要忽略的文件?

21个回答

4676

要取消跟踪已经添加/初始化到您的存储库中的单个文件,即停止跟踪该文件但不从系统中删除它,请使用:git rm --cached 文件名

要取消跟踪现在在您的.gitignore中的每个文件:

首先提交任何未解决的代码更改,然后运行此命令:

git rm -r --cached .

这将从 索引(index)(暂存区)中移除所有已更改的文件,然后只需运行:

git add .

提交它:

git commit -m ".gitignore is now working"

要撤销 git rm --cached 文件名,请使用 git add 文件名

在运行 git add . 之前,请确保提交了您的所有重要更改。否则,您将丢失对其他文件所做的任何更改。

请注意,当您将其推送到存储库并从其他地方拉取以使这些文件仍然被跟踪时,这些文件将被删除


292
请注意在提交更改之前全部保存,否则您将失去对所有更改文件的控制。 - Hoang Pham
9
@TravisWebb 你需要先确保设置好 .gitignore。我倾向于仅移除必要的文件而非全部从索引中移除,可以使用文件通配符如 *.o。 - Jason S
9
git rm -r --cached . 移除了比我在gitignore中列出的要多得多的文件 :( :(. 它还移除了我没有列出的目录中的文件。 - Dean Hiller
116
回答不错,但我认为 git rm --cached filename 更加温和一些。 - Jim Morrison
26
@JimMorrison,你误解了重点。如果你有一个具有复杂.gitignore的大型项目(如Visual Studio中的C#项目),找出每个要删除的单独文件是很烦琐的。这三个简单的命令可以轻松解决所有问题,而不会带来任何痛苦。 - longneck
显示剩余36条评论

725

如果你想忽略已经被版本库追踪的文件的更改(例如,一个 dev.properties 文件需要在本地环境下更改,但你永远不想将这些更改提交),那么你需要执行以下操作:

git update-index --assume-unchanged <file>

如果你想要重新开始跟踪变更:

git update-index --no-assume-unchanged <file>

请参阅git-update-index(1)手册页

如果您需要在git-reset之后保持此功能,请查看update-index的skip-worktreeno-skip-worktree选项(通过


更新: 以下是一个方便的别名,用于查看当前在本地工作区中“被忽略”(--assume-unchanged)的文件

git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"

18
太聪明了!极其有用。你知道是否有一种方法可以获得所有“挂起”文件的列表吗? - artfulrobot
15
这个命令对你有用:git ls-files -v 如果打印的字符是小写,那么这个文件被标记为“假定未更改”。请参考:https://dev59.com/inE95IYBdhLWcg3wUMPW#2363495 和 http://git-scm.com/docs/git-ls-files。 - dyodji
5
以下是我在我的~/.gitconfig文件中稍微详细一些的ignored别名版本: ignored = !git ls-files -v $(git rev-parse --show-toplevel) | (grep '^[[:lower:]]' || echo 'None ignored.') && echo '\nIgnore changes with: git update-index --assume-unchanged <file> \nor track again with: git update-index --no-assume-unchanged <file>' 这个命令中的toplevel部分确保它搜索整个存储库。 - Chris
3
遗憾的是,--assume-unchanged 无法与 git stash 配合使用:在 git stash 过程中更改会被还原,在 git stash pop 过程中也不会重新应用。详见 此问题 - Scott Weldon
7
不确定Mac上语法是否不同,但我必须稍微修改一下别名:git config --global alias.hidden '!git ls-files -v | grep "^[[:lower:]]"' - Crhistian Ramirez
显示剩余15条评论

382
为了取消跟踪已经被添加或初始化到您的存储库中的文件,即停止跟踪该文件但不从系统中删除它,请使用:git rm --cached filename

10
这是一种完美的方法,可以移除我添加、提交,但后来意识到不需要被追踪的几个文件。将这些文件加入到 .gitignore 中后,我能够完美地执行此操作并取消对它们的追踪。 - Andrew Larned
9
提示:例如,如果您将 *.config 添加到 .gitignore 中,则可以使用 git rm --cached *.config 停止跟踪所有 *.config 文件。 - dav_i
64
请注意,这样做会从您推送到的其他代码库中删除文件,即使文件仍保留在您的计算机上。如果您只是想忽略对文件的更改,并且不希望将它们从其他用户的代码库中删除,请尝试使用git update-index --assume-unchanged 文件名命令。 - dav_i
1
在我看来,这是正确的答案。维基百科的回答有点可行,但过于武断,特别是考虑到问题的复杂性。(我想修复维基百科,但我不确定该怎么做。“很快!”;) - Olie
@Olie 要非常小心这个“解决方案”。这将会删除仓库中的文件,任何拉取此更改的人也将删除该文件。最好的解决方案是像 @dav_i 所说的那样 assume-unchanged,或者选择 --skip-worktree 作为替代方案。 - Sebastianb

90

是的 - .gitignore 只会忽略当前没有被 Git 版本控制的文件。

也就是说,如果您已经使用 git-add 添加了一个名为test.txt的文件,则将test.txt添加到.gitignore中仍将跟踪对test.txt的更改。

您必须先运行 git rm test.txt 并提交该更改。然后才能忽略对 test.txt 的更改。


13
有所不尽真,可以忽略已追踪文件的更改……参见我的回答:https://dev59.com/L3M_5IYBdhLWcg3w-4nw#11366713。 - dyodji
git update-index --assume-unchanged <file> 和 git rm --caheced <file> 实际上对我没起作用。我使用了 git rm <file>,然后创建了新文件,在此之后成功忽略了<file>。 我正在使用 git 版本1.8.1——如果那是问题的话。 - mujaffars
你的语法有误。正确的语法是 git rm test.txt,这里有一个更全面的答案链接:https://dev59.com/NGcs5IYBdhLWcg3wrl4Z。 - Linnea Huxford
如果你的 .gitignore 对某些特定文件不起作用,那么这就是正确的答案。接受的答案将导致提交所有文件。 - devfaysal

55

去除.gitignore文件中的末尾空格

此外,请确保您的.gitignore文件中没有末尾空格。我来到这个问题是因为我在寻找答案时,有一种奇怪的感觉,我应该打开编辑器而不仅仅是cat .gitignore文件。只需从末尾删除一个额外的空格,就行了现在它可以正常工作了 :)


4
我也有完全相同的问题, :P。我也因此来到这个问题。很高兴你在这里记录了这个。+1 - Hindol
3
如果你和我一样使用vi快速编辑.gitignore文件,可以使用命令':set list'来显示空格和Tab符号。 - Sam Giles
1
这种情况发生在我执行 echo node_modules >> .gitignore 命令时(至少在 Windows 上)。 - Khôi
几周以来,我一直很沮丧,直到看到了你的空格帖子。谢谢,解决了我的问题。 - Blazes

48
我按照以下步骤进行了操作。
git rm -r --cached .
git add .
git reset HEAD

之后,git会删除所有应该被忽略的文件(在我的情况下是*.swp文件)。

3
小心这个选项,它默认你想添加除了被忽略的所有文件,但通常情况并非如此。请注意不改变原意。 - RoeeK
1
厉害了!+1 - Codetard

44

复杂答案无处不在!

只需使用以下内容

git rm -r --cached .

这将从源中删除您试图忽略的文件,而不是从计算机上的主分支!

之后只需提交并推送!


这只是解决方案的一半。还需要第二个命令: git add .致谢: https://dylanwooters.wordpress.com/2015/10/24/dear-git-stop-tracking-my-bin-folders/ - Ben

43
如果你想停止追踪文件,但又不想从本地系统中删除该文件,我建议你忽略config/database.yml文件。只需尝试以下操作:
git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

现在,将这个文件添加到.gitignore文件中并提交更改。从现在开始,git将不会跟踪对config/database.yml的任何更改。
$ echo config/database.yml >> .gitignore

31

要从跟踪中删除仅有的一些特定文件:

git update-index --assume-unchanged path/to/file

如果你想再次开始跟踪它:

git update-index --no-assume-unchanged path/to/file                      

29

正如dav_i所说,为了将文件保留在版本库中但又不创建额外的提交来从更改中移除它,您可以使用:

git update-index --assume-unchanged filename

5
撤销:git update-index --no-assume-unchanged 文件名 - Chemical Programmer
1
如果您想一次性处理文件夹中的所有文件,该怎么办? - bg17aw

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