顺便说一句,删除文件完全是最简单的选择(虽然你看,这不完全是简单的),前提是你不需要的文件在您的回购协议。另一个选择是使用像git lfs
这样的工具来允许你的仓库引用文件,而不需要直接将文件放入你的仓库。这解决了与git
中的大文件相关的许多问题,如果您确实需要该文件,应该考虑这些问题;但重写回购使用lfs
为一个已经提交的文件是另一个完整的话题...
所以,回到删除的问题。为了提供多一点背景:
Git中有三个地方的文件会被发现。
1)工作树木 - 仅仅是纯文本文件,你努力。 git
没有特别的努力来保存这里的数据,它只存在于本地。您可以通过git
以外的方式或使用git rm
(特别是如果您还需要将其从索引中删除)从这里删除文件。
2)索引 - 这是“分阶段”进行新提交的文件。当你说git add
你更新索引。 git
将挂在这里独立于工作副本的数据,但仍然只是本地的,并没有特别的努力来保存历史。 git rm
将从索引中提取文件。
3)数据库 - 这是你的项目的历史存在。当你说git commit
时,将表示项目的“对象”添加到数据库中。该数据库是git
保留历史,你必须走出去的方式,使git
从这里丢失任何数据。数据库基本上是在push
和fetch
操作期间在回购期间共享的内容。 git rm
对数据库没有影响。
现在,正如其他人所指出的,因为你已经创建了一个提交包含文件,你需要做的比git rm
多。第一步是重写任何包含提交文件的提交文件的历史记录。
有人说你需要解决的承诺是“介绍”的文件;这是误导。您需要处理全部对该文件的引用(或者在技术上,对代表该文件的BLOB
对象)。
因为rebase
解释,相对于他们的父母他们的变化方面承诺,它可以在一个相对便捷的方式处理这个问题,如果有的不是很多分支与合并加入的文件后发生的情况。例如,如果文件是在提交A
中创建的,并且唯一可以访问A
的引用是master
,并且在master
中没有合并提交比A
更新,那么rebase
是最简单的解决方案。假设A
不是根提交,
git rebase -i A^ master
(其中A^
是的SHA提交所引入的文件);但如果A
是根提交,这意味着A^
是无效的,那么
git rebase -i --root master
在弹出待办列表,您更改A
编辑命令,给出的提示进行编辑时提交你删除文件,然后告诉rebase
继续。
在这一点上,可能git push
将工作,因为git
不必发送整个数据库;它只是发送你告诉它推的参考文献的历史。但不要混淆:你仍然尚未从本地数据库中删除文件。要做到这一点,你必须确保没有任何东西(即使是reflog)可以到达该文件,然后使用git gc
。如果您已成功从所有裁判的历史记录中删除该文件,则最终会发生这种情况;这可能是文件,除非你受限于本地存储。
在上述过程中有几个重要的假设,如果您刚刚提交了这些假设可能存在的文件。但是如果存在多个分支可以达到承诺A
,并且/或者如果有合并提交可以达到A
,那么执行rebase
会变得更加困难。那时你会看到git filter-branch
或BFG Repo Cleaner
作为解决方案。在这两项中,BFG
对于这项任务来说要简单得多,速度更快;如果你搜索它,你可以找到许多来源(包括一些SO条目),概述了它的用法。因为filter-branch
更通用,所以使用起来更加困难,但它又是“内置”的 - 无需下载其他软件。
所有这些技术都会重写历史记录。由于您无法推送现有的历史记录,因此这可能不是什么大问题(假设您没有第二个已经推送更改的遥控器)。
https://rtyley.github.io/bfg-repo-cleaner/ – Sirko
你可以创建一个新的分支,拉最新的,并从当地移除然后puush到主? – AK47
或多一点上下文:https://help.github.com/articles/removing-sensitive-data-from-a-repository/ – Boldewyn