Git: 如何从历史提交中删除文件?

例如,我有一个 ID 为 56f06019的提交。在那次提交中,我意外地提交了大文件(50MB)。在另一个提交中,我添加了相同的文件,但是大小合适(很小)。现在我克隆的时候回收的东西太重了。如何从回购历史中删除该大文件,以减少我的回购的大小?

66424 次浏览

您将需要 Git rebase在交互模式下看到这里的一个例子: 如何删除对 GitHub 的提交?如何删除旧提交

如果你的提交是在 HEAD-10提交:

$ git rebase -i HEAD~10

在完成历史版本之后,您需要推送“新”历史,您需要添加 +来强制执行(请参阅 推送选项中的 refspec) :

$ git push origin +master

如果其他人已经克隆了您的存储库,您将通知他们,因为您刚刚更改了历史记录。

专业饭桶书的第9章有一个关于 移除对象的章节。

让我在这里简要地概述一下步骤:

git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
--tag-name-filter cat -- --all

像前面描述的重定基选项一样,filter-branch是重写操作。如果你已经发表了历史,你将不得不推动 --force新的参考。

filter-branch方法比 rebase方法强大得多,因为它

  • 允许您同时处理所有分支/参考文献,
  • 即时重命名任何标签
  • 即使自添加文件以来已有多次合并提交,也可以清晰地进行操作
  • 即使该文件在(a)分支的历史记录中被(重新)添加/删除了数次,该文件也可以干净地运行
  • 不会创建新的、不相关的提交,而是在修改与它们相关联的树时复制它们。这意味着像签名提交、提交备忘录等这样的东西被保留了下来

filter-branch也保留备份,所以回购的大小不会立即减少,除非你过期的重写和垃圾回收:

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger

您可以使用 git-extras工具。 抹去命令从存储库中完全删除一个文件,包括过去的提交和标记。

Https://github.com/tj/git-extras/blob/master/commands.md

我尝试在窗口上使用以下答案 Https://stackoverflow.com/a/8741530/8461756

单引号在窗口上不起作用; 您需要双引号。

跟踪对我很管用。

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PathRelativeRepositoryRoot/bigfile.csv" -- --all

删除大文件后,我可以将更改推送到 GitHub 主服务器。

您可以使用一个简单的命令来删除

 git rm -r -f app/unused.txt
git rm -r -f yourfilepath