我提交了id 56f06019(例如)。在那个提交中,我不小心提交了大文件(50Mb)。在另一个提交中,我添加相同的文件,但大小合适(小)。现在我克隆的回购太重了:(如何从回购历史中删除那个大文件以减少我的仓库的大小?
答案 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
方法强大得多,因为它
filter-branch
也会保留备份,因此除非您使reflogs和垃圾收集过期,否则repo的大小不会立即减少:
rm -Rf .git/refs/original # careful
git gc --aggressive --prune=now # danger
答案 1 :(得分:3)
您可以使用 git-extras 工具。 obliterate 命令从存储库中完全删除文件,包括过去的提交和标记。
答案 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