题 忽略已经提交到Git存储库的文件[重复]


这个问题在这里已有答案:

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


2192
2017-07-16 19:26


起源




答案:


去追踪一个  已经添加/初始化到您的存储库的文件, ,停止跟踪文件但不从系统中删除它: git rm --cached filename

去追踪 一切 现在在你的文件 .gitignore

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

git rm -r --cached .

这将删除任何已更改的文件 指数(暂存区),然后运行:

git add .

承诺:

git commit -m ".gitignore is now working"

撤销 git rm --cached filename, 使用 git add filename

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


3658
2017-07-06 17:09



请注意以前提交所有更改,否则您将失去对所有已更改文件的控制权 - Hoang Pham
@TravisWebb您必须首先确保设置.gitignore。此外,我倾向于不删除索引中的所有文件,只使用Fileglobs(例如* .o)中所需的文件 - Jason S
@trobrock你能否在一开始就编辑你的答案以包含提交?事先说。 - MEM
很棒的答案但是 git rm --cached filename 似乎有点不那么激烈的imho .. - Jim Morrison
@JimMorrison你错过了这一点。如果你有一个带有复杂.gitignore的大型项目(例如Visual Studio中的C#项目),那么找出要删除的每个文件是很乏味的。这三个简单的命令可以毫不费力地修复所有内容。 - longneck


如果您试图忽略对已在存储库中跟踪的文件的更改(例如,您需要为本地环境更改的dev.properties文件,但您永远不想检查这些更改),而不是您想要执行的操作是:

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

如果您想再次开始跟踪更改

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

看到 git-update-index(1)手册页

还看看了 skip-worktree 和 no-skip-worktree update-index的选项,如果你需要它来保持git-reset(通过


更新: 由于人们一直在问,这是一个方便的(以及下面评论的更新)别名,用于查看当前工作区中当前“忽略”( - 保持不变)的文件

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

518
2017-09-14 23:55



这是天才!非常有用。你知道是否有办法获得所有'暂停'文件的列表? - artfulrobot
这对你有用: git ls-files -v 如果打印的字符是小写的,则文件标记为假设未更改。看到: stackoverflow.com/a/2363495/677381 和: git-scm.com/docs/git-ls-files - dyodji
@dyodji这只影响我自己吗?还是所有用户? - wisbucky
这是我稍微冗长的版本 ignored 别名,因为它出现在我的〜/ .gitconfig文件中: 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>' 它的顶层部分确保它搜索整个存储库。 - Chris
不幸 --assume-unchanged 不起作用 git stash:更改将在期间恢复 git stash 并且没有重新申请 git stash pop。看到 这个问题。 - Scott Weldon


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


351
2017-07-18 08:15



这是删除我添加,提交的几个文件的完美方式,但后来意识到不需要跟踪。将这些文件添加到.gitignore后,我能够做到这一点并完美地解决它们。 - Andrew Larned
提示:例如,如果添加 *.config 到你的 .gitignore, 你可以做 git rm --cached *.config 停止跟踪所有 *.config 文件。 - dav_i
另请注意,执行此操作将删除您推送到的其他存储库中的文件,即使它保留在您的系统上。如果您只是忽略对文件的更改而不想从其他用户的repos中删除它们,请尝试使用 git update-index --assume-unchanged file.name - dav_i
IMO,这是 正确答案。维基的回答很有用,但非常严厉,特别是考虑到这个问题。 (我会修复维基,但我不确定如何。“很快!”;) - Olie
@Olie be 非常 小心这个“解决方案”。这个 将 删除仓库中的文件,任何提取此更改的人也会删除该文件。最好的解决方案是 assume-unchanged,如@dav_i所说,或 --skip-worktree 作为备选。 - Sebastianb


是的 - .gitignore 系统只忽略当前不受git版本控制的文件。

即如果你已经添加了一个名为的文件 test.txt 运用 git-add,然后添加 test.txt 至 .gitignore 仍然会导致更改 test.txt 被跟踪。

你必须这样做 git rm test.txt 首先并承诺改变。只有这样才会改变 test.txt 被忽略


78
2018-02-02 15:59



这不完全正确,可以忽略跟踪文件中的更改...请参阅我的回答: stackoverflow.com/a/11366713/677381 - dyodji
git update-index --assume-unchanged <file>和git rm --caheced <file>实际上并不适用于我。我已经完成了git rm <file>,然后创建了新文件 <file> 被成功忽略。我正在使用git版本1.8.1 - 如果那是问题。 - mujaffars
你的语法错了。它的 git rm test.txt 这是一个更全面的答案的链接 stackoverflow.com/questions/12661306/... - Linnea Huxford


删除.gitignore中的尾部空格

另外,请确保.gitignore中没有尾随空格。我得到了这个问题,因为我正在寻找答案,然后我有一种有趣的感觉,我应该打开编辑器,而不仅仅是cat'ing .gitignore。从末尾移除了一个额外的空间  它现在有效:)


50
2017-07-15 07:22



我有完全相同的问题,:P。我也因此而得到了这个问题。你在这里记录的好事。 +1 - Hindol
如果像我一样你使用vi快速编辑.gitignore使用':set list'来显示空格。 - Sam Giles
当我这样做时,这发生在我身上 echo node_modules >> .gitignore (至少在Windows上) - Khôi
几个星期以来,我一直对此感到沮丧,直到我看到你的空白帖子。谢谢,解决了我的问题。 - Blazes


我按照这些步骤

git rm -r --cached .
git add .
git reset HEAD

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


40
2018-03-02 09:00



小心那个,因为它假设你想要添加除被忽略之外的所有文件,通常情况并非如此 - RoeeK


如果要停止跟踪文件而不删除本地系统中的文件,我更喜欢忽略该文件 config/database.yml 文件。只需尝试:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

现在,将此文件添加到 .gitignore提交并提交更改。从现在开始,对config / database.yml所做的任何更改都不会被git跟踪。

$ echo config/database.yml >> .gitignore

谢谢


37
2017-08-21 14:20