提交后的.gitignore文件

291
我有一个托管在 Github 上的 Git 代码库。在提交了许多文件后,我意识到需要创建 .gitignore 文件,并排除 .exe.obj 文件。

然而,它会自动从代码库中删除这些已提交的文件吗?有没有强制删除它们的方法?

13
未来的谷歌搜索者可能会发现这非常有用。简洁明了:https://www.git-tower.com/learn/git/faq/ignore-tracked-files-in-git - Austin Dean
4
这回答您的问题吗?[如何让Git“忘记”被跟踪但现在已在.gitignore中的文件?] - LightCC
正确的答案在这里: https://dev59.com/pXM_5IYBdhLWcg3wrFMt#20241145。如果您执行“git rm --cached”(或只是删除有问题的文件并提交),它可以在检出时删除这些文件。使用“git update-index --skip-worktree <files>”将从直接跟踪中移除它们。 - LightCC
我刚刚在GitHub桌面版上解决了这个问题,方法是将错误提交的文件夹或文件暂时移出本地仓库,正确修改.gitignore文件,使用“修正提交”功能,将移动的文件夹和文件放回原来的位置,然后推送提交。 - Miguel Gonzalez
6个回答

413

不,你不能强制删除已经提交到仓库的文件,只是因为它被添加到了 .gitignore

你需要使用 git rm --cached 命令来删除仓库中不想要的文件。(由于你可能想保留本地副本但从仓库中删除,所以使用 --cached 参数。)因此,如果你想从仓库中删除所有的 exe 文件,请执行以下操作:

git rm --cached /\*.exe

(注意星号“*”是引用自Shell的,这使得Git而不是Shell来扩展文件和子目录的路径名)


7
实际上,如果你执行 git rm /\*.exe 命令,它将删除你存储库中的所有 .exe 文件。 - manojlds
7
"/'s" 是什么意思? - Costa Michailidis
7
@Costa,它们在那里是为了避免星号被解释成通配符,以防止Shell对其进行解释,因为星号是为 git 设计的。 - Lambart
6
警告:这些文件被保留在本地,这是事实...但是其他运行了“git pull”的用户将看到他们的文件被删除。 翻译:警告:这些文件存储在本地,但其他运行“git pull”的用户会看到它们被删除。请注意。 - Byscripts
撤销最后一次提交在VS Code中非常有用,我只是想提一下。 - Vitaliy Terziev

93

如果你还没有推送更改:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push

60

那么,它会自动从仓库中删除这些已提交的文件吗?

不会。即使存在 .gitignore 文件,您仍可以使用-f(强制)标志来暂存“被忽略”的文件。如果这些文件已经提交,它们不会自动被删除。

git rm --cached path/to/ignored.exe

这是否意味着我必须逐个删除每个 .exe 文件? - Madhur Ahuja
你可能可以批处理这个,但我不知道在Windows下如何工作。 - KingCrunch

23

我必须移除.idea和target文件夹,阅读所有评论后,这对我起作用了:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

然后推送到主分支


1
.idea was my problem I guess it was yours too :) - Olivier Pons

5

然而,它会自动从存储库中删除这些已提交的文件吗?

不会。

最好的方法是使用 git filter-branch,可以在此处阅读有关该方法的详细信息:

git-filter-branch的手册包含了全面的示例。

注意:您将重写历史记录。如果您发布了包含意外添加文件的修订版本,这可能会给那些公共分支的用户带来麻烦。通知他们,或者考虑一下您有多么需要删除这些文件。

注意:在存在标签的情况下,始终使用--tag-name-filter cat选项来运行git filter-branch。这永远不会有坏处,并且当您后来意识到需要它时,它将为您节省麻烦。


我运行了这个命令,它显示了 Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) 警告:Ref 'refs/heads/master' 没有更改,没有任何操作发生。 - Madhur Ahuja
这是一个警告,很可能意味着主分支尚未包含任何要删除的修订版本。您可以轻松检查。如果有问题,请更新问题。提示:使用 --all 一次重写所有(本地)分支。 - sehe

2
即使您删除了文件并提交了更改,这些文件仍然存在于历史记录中。如果要彻底删除它们,请考虑使用BFG Repo-Cleaner。它是git-filter-branch的替代方案。

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