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

时间:2012-01-05 09:29:47

标签: git

我提交了id 56f06019(例如)。在那个提交中,我不小心提交了大文件(50Mb)。在另一个提交中,我添加相同的文件,但大小合适(小)。现在我克隆的回购太重了:(如何从回购历史中删除那个大文件以减少我的仓库的大小?

5 个答案:

答案 0 :(得分:148)

Pro Git一书的第9章有一节Removing Objects

让我简要介绍一下这些步骤:

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

与前面描述的rebasing选项一样,filter-branch是重写操作。如果您已发布历史记录,则必须--force推送新的参考号。

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

  • 允许您一次处理所有分支/ refs,
  • 动态重命名任何标签
  • 即使自添加文件以来已经有多次合并提交,
  • 也会干净利落地运行 即使在(a)分支的历史中(重新)添加/删除了多次文件,
  • 也能干净地运作
  • 不会创建新的无关提交,而是在修改与其关联的树时复制它们。这意味着保留了诸如签名提交,提交注释等内容

filter-branch也会保留备份,因此除非您使reflogs和垃圾收集过期,否则repo的大小不会立即减少:

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

答案 1 :(得分:3)

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

https://github.com/tj/git-extras/blob/master/Commands.md

答案 2 :(得分:3)

我尝试在Windows上使用以下答案 https://stackoverflow.com/a/8741530/8461756

单引号在Windows上不起作用,您需要双引号。

以下为我工作。

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

删除大文件后,我可以将更改推送到github master。

答案 3 :(得分:1)

您需要在互动模式下git rebase查看此处的示例:How can I remove a commit on GitHub?how to remove old commits

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

$ git rebase -i HEAD~10

在您的历史记录编辑之后,您需要推送“新”历史记录,您需要添加+强制(请参阅push options中的refspec):

$ git push origin +master

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

答案 4 :(得分:0)

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

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