从整个Git仓库完全删除一个文件

35
使用git进行项目管理时,我不小心把一个巨大的.zip文件添加到了提交中。直到上传到Github之后才发现这个错误。在意识到错误后,我使用了ctrl-c、git remove和git commit命令,然后再次上传(此时该文件未被跟踪)。
我知道这样做并不正确,因为一旦提交了.zip文件,它就会一直留在存储库中,除非我撤消提交,但可惜我没有这么做。
现在,当有人尝试从存储库中下载文件时,需要很长时间才能完成,并且有时会出现“git远程端突然停止”的错误(我已经阅读过可以通过一些git配置来解决这个问题),非常令人烦恼。
我的问题是:是否有一种方法来告诉进一步的拉取/获取请求忘记这个特定的文件在这个特定的提交版本中?

1
@Cupcake 感谢你的提醒 :) 你可以看到它甚至是答案的一部分。问题本身并不完全相同,更不用说在我看来,__这个答案要好得多__,文档更好,提供的有用链接比那个重复的都要好。此外,你的帮助_1年前_会非常有用 ;) - Paulo Bu
相关 https://help.github.com/articles/removing-sensitive-data-from-a-repository/ - Trevor Boyd Smith
2个回答

64
Github提供了一个有用的帮助页面,介绍如何删除文件,像这样:删除敏感数据。在StackOverflow上还有其他相关问题: 此外,还可以参考Pro Git书中的这一节,其中提供了一个示例:

要从整个历史记录中删除名为passwords.txt的文件,可以使用--tree-filter选项进行过滤操作:

$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21)
Ref 'refs/heads/master' was rewritten
清理完毕后,您还可以尝试执行git gc来进一步压缩和清理存储库。

哇,我不知道 git gc 这个命令。我的 .git 目录刚刚从 35M 缩小到了 20M。 - mojuba
这之后我该如何提交?@Paul Dixon - alper
1
顺便说一句,对我来说第一个链接(GitHub 页面)似乎是最好的选择(它使用显著更快的“--index-filter”;其命令会影响所有分支和标签(就像问题所要求的);它提供了相关警告;并且它描述了非常有用的删除前后步骤)。 - Braham Snyder

4

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